具有xml有效负载的最小弹簧ws(2.4.0)端点

时间:2016-12-19 10:55:40

标签: xml spring endpoint payload

我特别需要SOAP端点。我们在我的组织中使用spring ws 2.4.0框架。

我们真正需要的是一个端点,它自己获取SOAP消息并返回一个String。消息有效负载是XML数据。我们需要做的就是使用MessageContext对象完成。我们不需要解组的XML等。

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

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x14d06fe0 {Error Domain=NSOSStatusErrorDomain Code=-12983 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-12983)}

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

  • 使用XML有效负载接收SOAP
  • 端点方法中捕获的SOAP消息
  • 使用messageContext参数
  • 做我的事情
  • return String(XML有效负载也可以。)

最好跳过XML-> POJO转换,因为有效负载XML large

1 个答案:

答案 0 :(得分:0)

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

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

您的弹簧配置包含:

<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处的子节点是主体。)