【问题标题】:Minimal spring ws (2.4.0) endpoint with xml payload带有 xml 有效负载的最小 spring ws (2.4.0) 端点
【发布时间】:2017-05-04 09:56:33
【问题描述】:

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

我们真正需要的是一个获取 SOAP 消息本身并返回一个字符串的端点。消息有效负载是 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 负载的 SOAP
  • 在 Endpoint 方法中捕获的 SOAP 消息
  • 用 messageContext 参数做我的事
  • 返回字符串(XML 负载也可以)

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

【问题讨论】:

    标签: xml spring endpoint payload


    【解决方案1】:

    您可以通过使用 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 处的子节点是主体。)

    【讨论】:

    • 非常感谢!我做了一些小的修改,比如用 SaajSOAPMessageFactory 替换 DomPoxMessageFactory 以使示例与我们的框架一起工作。现在我只需要了解如何将字符串作为 SOAP 响应传递给调用者。
    猜你喜欢
    • 2016-10-22
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2014-02-02
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多