2017-01-30 54 views
5

Mam usługę jax-ws przy użyciu ładunku opartego na schemacie. Dodawanie typ załącznika MTOM:błąd unmarshaling jaxb z usługi internetowej z MTOM

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

WS-import wygenerowany plik java wygląda poprawne:

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

Korzystanie SoapUI wysłać swoją prośbę.

nagłówków 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 

wtedy zobaczyć część HTTP z zakodowanym sekcji Plik:

------=_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... 

Ale wciąż otrzymuję ten błąd:

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

jakieś sugestie?

+0

wszystkich WSDL, adnotacje, nagłówki HTTP i część http wydaje poprawne. Może to błąd MOXY. Proponuję spróbować ze standardowym kontekstem JAXB. –

+0

Używamy funkcji moxy funkcji getValueByXPath(), którą moxy dostarcza do wyodrębniania wartości z obiektów jaxb za pomocą xpath. Nie sądzę, by standard JAXB zapewniał taką możliwość. – OldProgrammer

Odpowiedz

0

Komunikat o błędzie mówi, że wartość MjAxNi0wMS0wNVQwOTowMDowMA== jest niedozwolona. Jeśli to sprawdzić, to base64 zakodowana data:

2016-01-05T09:00:00 

ja nie wiem, czy nie ma innego pola w obiekcie Starasz się wycofać. Ale na wypadek, gdyby proces unmarsall nie był w stanie obsłużyć zakodowanych wartości base64. Powinieneś sprawdzić, czy gdzieś jest potrzebny adapter.

W jednym zdaniu: Prawdopodobnie powinieneś mieć dekoder base64 lub sprawdzić oryginalną usługę, ponieważ dekodowane String nie jest tak naprawdę niektórymi danymi binarnymi.

(Po włożeniu wszystkich kodów stosowanych mogłem wziąć dogłębnej przyjrzeć.)

+0

To jest dane binarne. Problem polega na tym, że nie należy go włączać w linię w jaxb, ale można go wywoływać za pomocą obiektu DataHandler, który jest częścią definicji obiektu. Przepraszam, ale tak naprawdę nie dostaję o wiele dalej. Dzięki. – OldProgrammer

+0

Spróbuj zmienić 'DataHandler' na' Object' i sprawdź, co jest ustawione w sesji debugowania. Dla mnie jest to nadal niewyraźne, dlaczego uważasz, że obsługa plików jest problemem, gdy błąd pokazuje datę zakodowaną w base64. – Mark