首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有xml有效负载的最小spring ws (2.4.0)端点

带有xml有效负载的最小spring ws (2.4.0)端点
EN

Stack Overflow用户
提问于 2016-12-19 10:55:40
回答 1查看 837关注 0票数 0

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

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

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

代码语言:javascript
运行
复制
 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框架。因此,任何想法,我如何能够做到这一点,以最小的配置:

  • 接收带有XML有效负载的SOAP
  • 端点方法捕获的SOAP消息
  • 用messageContext参数做我的事情
  • 返回字符串(XML有效负载也可以)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-21 15:32:04

您可以通过使用DomPoxMessageFactory和您自己编写的MessageEndpoint的简单实现来实现这一点。如下所示:

代码语言:javascript
运行
复制
@Override
public void invoke(MessageContext messageContext) throws Exception {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    messageContext.getRequest().writeTo(out);
    String message = out.toString();
    ...
}

您的spring配置将包含:

代码语言:javascript
运行
复制
<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处的子节点是主体。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41221056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档