Spring WS WebServiceTemplate:访问响应的内容或自定义unmarshaller

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring WS WebServiceTemplate:访问响应的内容或自定义unmarshaller相关的知识,希望对你有一定的参考价值。

我正在向外部SOAP服务发送一条消息,该服务应该使用包含图像等功能的soap消息进行回复。这是我编写的用于发送消息的代码:

@Bean
Jaxb2Marshaller jaxb2Marshaller() {
    Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
    jaxb2Marshaller.setContextPath("myContextPath");

    return jaxb2Marshaller;
}

@Bean
public WebServiceTemplate webServiceTemplate() {
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
    webServiceTemplate.setMessageSender(webServiceMessageSender());
    webServiceTemplate.setMarshaller(jaxb2Marshaller());
    webServiceTemplate.setUnmarshaller(jaxb2Marshaller());
    webServiceTemplate.setDefaultUri(defaultUri);
    return webServiceTemplate;
}

public ProcessDocumentResponse sendRequest(MyRequest myRequest) {
    MyResponse response = (MyResponse) webServiceTemplate.marshalSendAndReceive(
            myRequest,
            message -> ((SoapMessage) message).setSoapAction(theAction));
    return response;
}

这是从日志中获得的响应:

Receiving response: HTTP/1.1 200 OK
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:_someUUID_";start-info="text/xml"
Server: Microsoft-IIS/10.0
MIME-Version: 1.0
X-AspNet-Version: ...
X-Powered-By: ...
Date: Wed, 11 Oct 2017 09:10:36 GMT
Content-Length: 228346
Connection can be kept alive indefinitely
"[
][
]"
"--uuid:_someUUID_[
][
]"
"Content-ID: <http://tempuri.org/0>[
][
]"
"Content-Transfer-Encoding: 8bit[
][
]"
"Content-Type: application/xop+xml;charset=utf-8;type="text/xml"[
][
]"
"[
][
]"
"<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body>
<here a long response and at some point:><OutputImages><ImageData><xop:Include href="cid:http://tempuri.org/1/636433219150087850" xmlns:xop="http://www.w3.org/2004/08/xop/include"/></ImageData><Metadata i:nil="true"/></OutputImages>
</s:Body></s:Envelope>[
][
]"
"--uuid:_someUUID_[
][
]"
"Content-ID: <http://tempuri.org/1/636433098360776690>[
][
]"
"Content-Transfer-Encoding: binary[
][
]"
"Content-Type: application/octet-stream[
][
]"
"[
][
]"
"[0xff][0xd8][0xff][0xe0][0x0]_here a long sequence o bytes representing an image_
<< "--uuid:_someUUID_[
][
]"

如您所见,有两个多部分内容。在第一个多部分内容中,ImageData包含:

<OutputImages><ImageData><xop:Include href="cid:http://tempuri.org/1/636433219150087850" xmlns:xop="http://www.w3.org/2004/08/xop/include"/></ImageData><Metadata i:nil="true"/></OutputImages>

链接cid:http://tempuri.org/1/636433219150087850是第二个多部分内容的ID。

问题是在解组消息之后,我的响应包含一个byte [] imageData,它是空的,但应该包含第二个多部分内容中的字节。所以我不知道如何面对这个问题,我应该将一些配置更改为unmarshaller吗? (怎么样?)我应该访问HttpResponse(如何?),但是如何填充响应中的byte []值?

答案

经过一番挣扎,我找到了解决方案。关键是要了解这个机制是如何调用的,我忽略了它,对我感到羞耻。

它被称为MTOM,我的问题的解决方案只是在marshaller创建中的一行:

    @Bean
    Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
        jaxb2Marshaller.setContextPath("myContextPath");
        jaxb2Marshaller.setMtomEnabled(true); //that's it!!

        return jaxb2Marshaller;
    }

当我碰到this帖子,然后寻找MTOM的含义,最后在Spring WS Documentation解决方案时,我找到了解决方案

以上是关于Spring WS WebServiceTemplate:访问响应的内容或自定义unmarshaller的主要内容,如果未能解决你的问题,请参考以下文章

spring-ws:找不到端点映射

Spring-WS:具有 WSDL 多节点分类的 SimpleWsdl11Definition

来自 WSDL 的 Spring-ws 客户端

基于Spring-WS的Restful API的集成测试

如何使用 Spring Ws marshall 调用 Paypal ws?

spring 发布 Jax-Ws Service