2017-10-11 67 views
0

다른 SOAP 서비스로 응답해야하는 외부 SOAP 서비스에 메시지를 보내고 있습니다. 이 내가 메시지를 보내 쓴 코드 :Spring WS WebServiceTemplate : 응답의 내용에 액세스하거나 unmarshaller를 사용자 정의합니다.

@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의 함유가 : http://tempuri.org/1/636433219150087850 번째 멀티 콘텐츠 ID이다 CID 링크

<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> 

.

메시지를 언 마샬링 한 후 내 응답에 비어 있지만 두 번째 다중 내용에 바이트가 들어있는 byte [] imageData가 포함되어있는 것이 문제입니다. 그래서이 문제에 어떻게 대처해야 할 지 잘 모르겠습니다. 언 마샬 러에 대한 설정을 변경해야합니까? (어떻게?) HttpResponse (어떻게?)에 액세스해야하나요? 그렇다면 응답에서 byte [] 값을 어떻게 채울 수 있습니까?

답변

0

어려움을 겪은 끝에 해결책을 찾았습니다. 열쇠는이 메커니즘이 어떻게 불려지는지를 이해하는 것이 었습니다.

것은 그것은 MTOM라고하며 내 문제의 해결책은 마샬 생성 단지 행 더 :

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

     return jaxb2Marshaller; 
    } 

내가 this 포스트에 충돌 한 다음 MTOM의 의미를 찾을 때 나는 해결책을 발견 마지막으로 용액은 Spring WS Documentation