2017-01-30 19 views
5

У меня есть веб-сервис jax-ws с использованием полезной нагрузки на основе схемы. Добавление тип вложения MTOM:ошибка unmarshaling jaxb из веб-службы с MTOM

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

WS-импорт сгенерированный файл Java выглядит правильно:

@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

все из WSDL, аннотации, заголовки HTTP и HTTP часть кажется правильным. Возможно, это ошибка MOXY. Я предлагаю попробовать со стандартным JAXB Context. –

+0

Мы используем функцию moxy функции getValueByXPath(), которую moxy предоставляет для извлечения значений из объектов jaxb с помощью xpath. Я не думаю, что стандартный JAXB предоставляет эту возможность. – OldProgrammer

ответ

0

В сообщении об ошибке в основном указано, что значение MjAxNi0wMS0wNVQwOTowMDowMA== является незаконным. Если вы проверяете его, это base64 кодируется дата:

2016-01-05T09:00:00 

Я не знаю, если есть другое поле в объекте Вы пытаетесь маршализацией. Но в случае, если процесс unmarsall не способен обрабатывать кодированные (base) значения base64. Вы должны проверить, нужен ли какой-либо адаптер.

В одном предложении: Вероятно, вы должны иметь декодер base64 или проверить исходную услугу, поскольку декодированный String на самом деле не является некоторыми двоичными данными.

(Если вставить все коды, используемые я мог взять в глубокий взгляд на него.)

+0

Это двоичные данные. Проблема заключается в том, что он не должен быть включен в строку в jaxb, но может быть оставлен через объект DataHandler, который является частью определения объекта. Извините, но на самом деле меня не намного больше. Благодарю. – OldProgrammer

+0

Попробуйте изменить 'DataHandler' на' Object' и проверьте, что установлено там в сеансе отладки. Для меня все еще размыто, почему вы считаете, что проблема с обработкой файлов является проблемой, в то время как ошибка показывает некоторую дату с кодировкой base64. – Mark