Spring — Spring-WS с SOAP с вложениями или MTOM с JAXB в качестве связывателя данных

У меня есть веб-служба Spring-WS, где я хотел бы иметь возможность отправлять двоичные данные клиенту. Мое намерение состоит в том, чтобы отформатировать ответ SOAP для использования MTOM или Soap с вложениями. Ответ будет объектом JAXB.

Я уже настроил среду Spring-WS и могу отправлять и получать запросы с использованием JAXB. Однако я изо всех сил пытаюсь настроить ответ на двоичное вложение, так как большинство руководств и информации в Интернете в основном связаны с отправкой вложений клиентами, тогда как я заинтересован в том, чтобы сервер отправлял вложения обратно клиенту.

Два вопроса:

  • Какой рекомендуемый подход для возврата двоичных данных клиенту? SOAP с вложениями, MTOM или просто вернуть данные в кодировке base64 в виде тега xml?

  • Существуют ли какие-либо примеры, показывающие, как настроить Spring-WS для возврата двоичных вложений с использованием любого из двух методов?


person ziggy    schedule 30.06.2012    source источник
comment
не могли бы вы проверить, у вас были сомнения относительно того, кэширует ли mtom все данные в памяти перед отправкой binary-data-in-client-memory-before-sendin" title="использует ли mtom на клиенте, загружает все двоичные данные в память клиента перед отправкой"> stackoverflow.com/questions/61483726/.   -  person yolob 21    schedule 06.05.2020


Ответы (1)


1) Mtom, по-видимому, является стандартом де-факто для отправки файлов через мыло, поэтому я бы рекомендовал его.

2) если вы посмотрите на пример mtom, который поставляется с дистрибутивом spring-ws (не от maven), вы увидите 90% необходимой настройки. единственное отличие - это ожидаемыйContentType для вашего вложения, вы должны установить его в application/octet-stream

теперь ваш код на сервере будет выглядеть примерно так

try {
        dataHandler = new DataHandler(new File("/tmp/test.exe").toURL());
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    return new JaxbObjectResponse("id", dataHandler);

и ваше определение схемы выглядит примерно так.

<xsd:element name="JaxbObjectResponse">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="id" type="xsd:string" />
            <xsd:element name="file" type="xsd:base64Binary" xmime:expectedContentTypes="application/octet-stream" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
person Shaun Stone    schedule 12.07.2012
comment
Да, в конце концов я нашел пример MTOM в примере spring-ws. Считаете ли вы, что если я использую MTOM, клиент также должен быть включен MTOM? Я заставил его работать, но проблема, которую я обнаружил, заключается в том, что когда я тестирую службу, некоторые клиенты (SoapUI) возвращают правильный ответ, а некоторые клиенты (XMLSpy) просто выдают ошибку о том, что служба вернула ответ NULL. Должен ли клиент также поддерживать MTOM, чтобы я мог использовать MTOM? - person ziggy; 13.07.2012
comment
Клиент должен будет понимать mtom или, точнее, xop. потому что элемент xop предоставит клиенту идентификатор содержимого, для которого составной ответ сопоставляется с этим элементом. xop является официальным стандартом, поэтому все (хорошие/правильные) клиенты должны поддерживать его. w3.org/TR/xop10 - person Shaun Stone; 13.07.2012
comment
Хорошо спасибо. У меня вариант MTOM работает нормально. Сейчас я пытаюсь использовать SAAJ (чтобы иметь возможность использовать вложения), но пока не могу заставить его работать. stackoverflow.com/questions/11430527/ - person ziggy; 13.07.2012