具有 xml 负载的最小 spring ws (2.4.0) 端点

Minimal spring ws (2.4.0) endpoint with xml payload

我对 SOAP 端点有特殊需求。我们在我的组织中使用 spring ws 2.4.0 框架。

我们真正需要的是一个获取 SOAP 消息本身和 returns 字符串的端点。消息负载是 XML 数据。我们需要做的所有事情都可以使用 MessageContext 对象来完成。我们不需要解组 XML 之类的。

我一直在做一些实验,但总是出现以下错误:

 No adapter for endpoint [public java.lang.String org.company.endpoint.MyEndpoint.receiveSOAP(org.springframework.ws.context.MessageContext) throws java.lang.Exception]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?

我现在可能有大量不必要的配置搞乱了我的 Spring ws 框架。所以任何关于如何用最少的配置做到这一点的想法:

最好跳过 XML->POJO 转换,因为负载 XML 是 巨大

您可以通过使用 DomPoxMessageFactory 和您自己编写的 MessageEndpoint 的简单实现来实现此目的。像这样:

@Override
public void invoke(MessageContext messageContext) throws Exception {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    messageContext.getRequest().writeTo(out);
    String message = out.toString();
    ...
}

您的 spring 配置将包含:

<bean id="messageReceiver" class="com.yourcompany.MessageReceiver"/>

<bean id="messageFactory" class="org.springframework.ws.pox.dom.DomPoxMessageFactory">
</bean>

<!-- Register PayloadRootAnnotationMethodEndpointMapping -->
<bean class="org.springframework.ws.server.endpoint.mapping.SimpleMethodEndpointMapping">
    <property name="interceptors">
        <list>
            <ref bean="loggingInterceptor"/>
        </list>
    </property>
    <property name="defaultEndpoint" ref="fileReceiver"/>
    <property name="endpoints">
        <list>
            <ref bean="fileReceiver"/>
        </list>
    </property>
</bean>

<bean id="endpointAdapter" class="org.springframework.ws.server.endpoint.adapter.MessageEndpointAdapter"/>

<bean id="loggingInterceptor" class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor">
</bean>

<bean id="handlerAdapter" class="org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter">
    <property name="messageFactory" ref="messageFactory"/>
</bean>

<bean id="wsdlName" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
    <property name="schema" ref="schema"/>
    <property name="portTypeName" value="MyInterface"/>
    <property name="locationUri" value="/ws/somepath/"/>
    <property name="targetNamespace" value="http://test.yourcompany.com/" />
    <property name="createSoap12Binding" value="true" />
    <property name="createSoap11Binding" value="false" />

</bean>

<bean id="schema" class="org.springframework.xml.xsd.SimpleXsdSchema">
    <property name="xsd" value="WEB-INF/schema.xsd"/>
</bean>

您在端点中获得的消息字符串将包含整个 XML,因此包括 SOAP 信封等。如果您只想要邮件正文,请执行

messageContext.getRequest().getPayloadSource()

您将获得一个 DOM 负载源,您可以在其中查找包含消息内容的节点。 (第一个子节点是信封,该节点索引 3 处的子节点是正文。)