2017-01-30 17 views
5

스키마 기반 페이로드를 사용하는 jax-ws 웹 서비스가 있습니다. MTOM 첨부 파일 유형을 추가 :MTOM을 사용하여 웹 서비스에서 jaxb를 마샬링 해제하는 중 오류가 발생했습니다.

<xs:element name="Attachment" type="xs:base64Binary" 
      xmime:expectedContentTypes="application/octet-stream" 
      minOccurs="0" maxOccurs="1" > 
</xs:element> 

WS-수입 생성 된 자바 파일이 올바른 같습니다

@XmlRootElement(name = "Contact") 
public class Contact { 
    @XmlElement(name = "Attachment") 
    @XmlMimeType("application/octet-stream") 
    protected DataHandler attachment; 

요청을 보낼 soapUI 사용.

HTTP 헤더 :

Accept-Encoding: gzip,deflate 
Content-Type: multipart/related; type=application/xop+xml; start=<[email protected]>; start-info=text/xml; boundary=----=_Part_96_20541990.1485816424570 
SOAPAction: http://hsn.us.banner.hsntech.com/Level1Request 
MIME-Version: 1.0 
Content-Length: 47624 
    [1]: https://i.stack.imgur.com/BEbZS.jpg 

그런 다음 인코딩 된 파일 섹션과 HTTP 부분을 참조하십시오

------=_Part_96_20541990.1485816424570" 
Content-Transfer-Encoding: binary" 
Content-ID: <test1.jpg>" 
Content-Disposition: attachment; name="test1.jpg"; filename="test1.jpg"" 
[0xff][0xd8][0xff][0xe0][0x0][0x10]JFIF[0x0][0x1][0x1][0x1][0x0]`[0x0]`[0x0][0x0][0xff][0xdb][0x0]C[0x0][\n]"... etc... 

을하지만이 오류가 점점 계속 :

[Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.XMLMarshalException&#xd; 
Exception Description: An error occurred unmarshalling the document&#xd; 
Internal Exception: java.lang.IllegalArgumentException: MjAxNi0wMS0wNVQwOTowMDowMA==]</faultstring></ns0:Fault></S:Body></S:Envelope> 

어떤 제안?

+0

모든 (당신은. 나는 그것에 깊이보기에 걸릴 수 있습니다 사용하는 코드를 모두 삽입하는 경우) 및 HTTP 부분은 올바른 것 같다. 아마 그것은 MOXY 버그 일 것입니다. 나는 표준 JAXB Context로 시도해 볼 것을 제안한다. –

+0

우리는 xoxy로 jaxb 객체로부터 값을 추출하기 위해 moxy가 제공하는 getValueByXPath() 함수의 moxy 기능을 사용하고 있습니다. 나는 표준 JAXB가 그 기능을 제공한다고 생각하지 않는다. – OldProgrammer

답변

0

오류 메시지는 기본적으로 MjAxNi0wMS0wNVQwOTowMDowMA== 값이 유효하지 않음을 나타냅니다.

2016-01-05T09:00:00 

당신은 비 직렬화하려고하는 객체의 다른 필드가 있는지 나도 몰라 : 당신이 그것을 선택하면, 그것은 base64 인코딩 된 날짜입니다. 그러나 unmarsall 프로세스가있는 경우 base64로 인코딩 된 값을 처리 할 수 ​​없습니다. 어딘가에 필요한 어댑터가 있는지 확인해야합니다.

한 문장으로 : 디코드 된 String은 실제로 일부 바이너리 데이터가 아니므로 base64 디코더가 있거나 원래 서비스를 확인해야합니다.

WSDL, 주석, HTTP 헤더의

+0

이진 데이터입니다. 문제는 그것이 jaxb에 인라인으로 포함되어서는 안되지만 객체 정의의 일부인 DataHandler 객체를 통해 확장 가능해야한다는 것입니다. 미안하지만, 정말로 나를 더 많이 얻지는 않습니다. 감사. – OldProgrammer

+0

'DataHandler'를'Object'로 바꾸고 디버그 세션에서 무엇이 설정되어 있는지 살펴보십시오. 나를 위해 그것은 여전히 ​​모호한 이유는 오류가 일부 base64 인코딩 된 날짜를 보여주는 동안 파일 처리가 문제라고 생각합니까? – Mark