Spring WS WebServiceTemplate:获取响应内容或自定义解组器
Spring WS WebServiceTemplate: access to the content of the response or customising the 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
"[\r][\n]"
"--uuid:_someUUID_[\r][\n]"
"Content-ID: <http://tempuri.org/0>[\r][\n]"
"Content-Transfer-Encoding: 8bit[\r][\n]"
"Content-Type: application/xop+xml;charset=utf-8;type="text/xml"[\r][\n]"
"[\r][\n]"
"<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>[\r][\n]"
"--uuid:_someUUID_[\r][\n]"
"Content-ID: <http://tempuri.org/1/636433098360776690>[\r][\n]"
"Content-Transfer-Encoding: binary[\r][\n]"
"Content-Type: application/octet-stream[\r][\n]"
"[\r][\n]"
"[0xff][0xd8][0xff][0xe0][0x0]_here a long sequence o bytes representing an image_
<< "--uuid:_someUUID_[\r][\n]"
如您所见,有两个多部分内容。在第一个多部分内容中,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>
那个linkcid:http://tempuri.org/1/636433219150087850是第二个多部分内容的ID。
问题是在解组消息后,我的响应包含一个空的 byte[] 图像数据,但应该包含第二个多部分内容中的字节。
所以我不完全知道如何面对这个问题,我应该更改一些配置到 unmarshaller 吗? (如何?)
我应该访问 HttpResponse(如何访问?),但我如何才能在响应中填充 byte[] 值?
经过一番挣扎,我找到了解决办法。
关键是要了解这个机制是如何调用的,我忽略了它,真丢人。
它被称为 MTOM,我的问题的解决方案只是在编组器创建中多了一行:
@Bean
Jaxb2Marshaller jaxb2Marshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setContextPath("myContextPath");
jaxb2Marshaller.setMtomEnabled(true); //that's it!!
return jaxb2Marshaller;
}
我在遇到this post, and then looking for the meaning of MTOM and finally the solution in the Spring WS Documentation
时找到了解决方案
我正在向外部 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
"[\r][\n]"
"--uuid:_someUUID_[\r][\n]"
"Content-ID: <http://tempuri.org/0>[\r][\n]"
"Content-Transfer-Encoding: 8bit[\r][\n]"
"Content-Type: application/xop+xml;charset=utf-8;type="text/xml"[\r][\n]"
"[\r][\n]"
"<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>[\r][\n]"
"--uuid:_someUUID_[\r][\n]"
"Content-ID: <http://tempuri.org/1/636433098360776690>[\r][\n]"
"Content-Transfer-Encoding: binary[\r][\n]"
"Content-Type: application/octet-stream[\r][\n]"
"[\r][\n]"
"[0xff][0xd8][0xff][0xe0][0x0]_here a long sequence o bytes representing an image_
<< "--uuid:_someUUID_[\r][\n]"
如您所见,有两个多部分内容。在第一个多部分内容中,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>
那个linkcid:http://tempuri.org/1/636433219150087850是第二个多部分内容的ID。
问题是在解组消息后,我的响应包含一个空的 byte[] 图像数据,但应该包含第二个多部分内容中的字节。 所以我不完全知道如何面对这个问题,我应该更改一些配置到 unmarshaller 吗? (如何?) 我应该访问 HttpResponse(如何访问?),但我如何才能在响应中填充 byte[] 值?
经过一番挣扎,我找到了解决办法。 关键是要了解这个机制是如何调用的,我忽略了它,真丢人。
它被称为 MTOM,我的问题的解决方案只是在编组器创建中多了一行:
@Bean
Jaxb2Marshaller jaxb2Marshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setContextPath("myContextPath");
jaxb2Marshaller.setMtomEnabled(true); //that's it!!
return jaxb2Marshaller;
}
我在遇到this post, and then looking for the meaning of MTOM and finally the solution in the Spring WS Documentation
时找到了解决方案