从 Spring 集成调用 POX Web 服务

Call POX web service from Spring Integration

我在一个项目中使用 Spring 集成,该项目(成功)集成了各种 ReST/JSON 和 SOAP 端点。 现在我需要调用配置为接受 Plain-Old-Xml-over-HTTP 的 BusinessWorks 实例。 从 "Spring Integration in Action book",我得到一个提示,我应该为此使用 int-ws:outbound-gateway。 此配置生成正确的请求,但在 SOAP 中:

<int-ws:outbound-gateway
    uri="..."
    request-channel="request" reply-channel="reply"
    marshaller="marshaller" unmarshaller="unmarshaller"/>

我不知道如何配置它以将负载中的对象作为 POX(无 SOAP 信封)发送。 我试过这个:

<int-ws:outbound-gateway
    uri="..."
    request-channel="request" reply-channel="reply"
    marshaller="marshaller" unmarshaller="unmarshaller"
    message-factory="poxMessageFactory"/>
<bean id="poxMessageFactory"
    class="org.springframework.ws.pox.dom.DomPoxMessageFactory"/>

请求似乎仅正确切换到 XML,但请求正文为空(Spring 集成有效负载中没有对象的踪迹)。 有人可以告诉我我做错了什么或如何实现我想要做的事情吗?

我认为这是AbstractWebServiceOutboundGateway中的遗漏:

 public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
        Object payload = this.requestMessage.getPayload();
        if (message instanceof SoapMessage) {
            this.doWithMessageInternal(message, payload);
            AbstractWebServiceOutboundGateway.this.headerMapper
                    .fromHeadersToRequest(this.requestMessage.getHeaders(), (SoapMessage) message);
            if (this.requestCallback != null) {
                this.requestCallback.doWithMessage(message);
            }
        }

    }

关注if (message instanceof SoapMessage) {.

所以,我们确实错过了消息可以是不同类型的事实。

请就此事展开JIRA bug

同时,作为解决方法,我建议您直接使用 WebServiceTemplate 而不是 <int-ws:outbound-gateway>,您可以使用 marshalSendAndReceive() 方法从 <service-activator> 调用它进行交互。