MTOM - тип корневого содержимого всегда был text/xml

Я использую MTOM для потоковой передачи вложенного файла с клиента на сервер.

MTOM применяется, и файл передается в виде двоичного файла. Но корневым Content-Type всегда был "text /xml", который должен быть "application /xml +xop".

Проблемы возникают только в веб-сфере. Тип контента был задан как "text /xml" в веб-сфере.

В профиле свободы веб-типа тип контента был установлен как "application /xml +xop"

------=_Part_7283_-2062365125.1458743649653
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-Id: <511212039242.1458743649653.IBM.WEBSERVICES@lsrv4665.linux.rabobank.nl>

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soapenv:Header>
        </soapenv:Header>
        <soapenv:Body>
          <Content><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:58cf03d2-322f-4819-80fb-3b001f497d12%40www.test.com"/>
          </Content>
        </soapenv:Body>
    </soapenv:Envelope>

    Content-Type: application/pdf; name=attachment.pdf

Content-Transfer-Encoding: binary

2 ответа

Решение

Способен решить эту проблему с помощью saaj-impl jar.

pom.xml

 <dependency>
    <groupId>com.sun.xml.messaging.saaj</groupId>
    <artifactId>saaj-impl</artifactId>
    <version>1.3.16</version>
    <scope>provided</scope>
 </dependency>

диспетчер-servlet.xml

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
  <property name="messageFactory">
    <bean class="com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl" />
  </property>
</bean>

Я собрал пару ответов. Надеюсь, что первый ответ подойдет для вас. Для предосторожности я также добавил еще один ответ со ссылками. Надеюсь, это спасет вас.

Ans-1:

серверная часть (JAX-WS в Weblogic)

использование @MTOM аннотация или mtom.xml политика

клиентская часть (JAX-WS в Weblogic)

Pass MTOMFeature() as argument:
MtomService port = service.getMailServicePort(new MTOMFeature());

Подключение MTOM через SOAPUI, 3 шага:

  1. Set Enable MTOM = true в свойствах запроса
  2. Загрузите вложение (например, A3.pdf), обратите внимание на contentID
  3. Установите MTID contentID в запросе xml

Вот полный пример с изображениями с weblogic. Надеюсь, что это будет соответствовать вашей проблеме.(Ссылка для отправки вложения: MTOM / XOP против SWA и встроенного вложения)

Другая ссылка на ресурс:

  1. Шаги по использованию MTOM / XOP для отправки двоичных данных
  2. Ошибка при использовании веб-службы, тип содержимого "application/xop+xml" не соответствует ожидаемому типу "text/xml"

Ans-2:

Тянет в saaj-impl 1.3.23 и предпочитая классы приложений для javax.xml.soap.* решил эту проблему.

Ссылка на ресурс: https://jira.spring.io/browse/SWS-855


Ans-3:

Из руководства mkyong это можно решить, включив mtom на клиенте и сервере.

Включение MTOM на сервере:

Разрешить серверу отправлять вложения через MTOM очень просто, просто аннотируйте класс реализации веб-службы с помощью javax.xml.ws.soap.MTOM,

Включение MTOM на клиенте:

Чтобы клиент мог отправлять вложения через MTOM на сервер, требуются дополнительные усилия, см. Следующий пример:

//codes enable MTOM in client
BindingProvider bp = (BindingProvider) imageServer;
SOAPBinding binding = (SOAPBinding) bp.getBinding();
binding.setMTOMEnabled(true);

ANS-4

Кредит переходит к @ BalusC. Он дал потрясающий ответ своим великолепным руководством.

Метатег игнорируется, когда страница обслуживается по HTTP.

При использовании JSP,

ты должен положить <%@ page pageEncoding="UTF-8" %> в топе.

При использовании сервлета,

ты должен сделать response.setCharacterEncoding("UTF-8");,

Оба неявно установят правильную кодировку в заголовке типа контента. Вы можете найти эту статью полезной: Юникод - Как правильно настроить символы?, Для решений JSP/Servlet начните с этой главы.

Ссылка на ресурс:

  1. Как установить "Content-Type ... charset" в заголовке запроса, используя ссылку HTML

Для исследования вы можете пройти через следующие

Для сервлета Java у вас должна быть строка

response.setContentType("text/html");

в верхней части вашего doGet или же doPost метод, где ответ является ссылкой на HttpServletResponse,

Ссылка по теме:

  1. Как настроить сервер для отправки правильных типов MIME
  2. Проблема кодировки символов в IBM JSF и Ajax

Другой ответ

Я выяснил, что является причиной проблемы, но я не понимаю, почему. Поведение проявляет себя, когда есть запрос на ошибку по запросу. Прикрепленный почтовый индекс простой MPG с правилом запроса, ответа и ошибки, которые демонстрируют это. Запрос имеет действие по ошибке, простую форму xform, которая выполняет команду dp:reject (чтобы вызвать ошибку), и действие результатов. Правило ошибки имеет действие результатов и заданное действие var. Если вы оставите on-error в, тип содержимого ответа будет возвращен как "text/xml". Если вы удалите сообщение об ошибке, тип содержимого правильно вернет "application/json". (Скопировано из следующей ссылки на ресурс)

Ссылка на ресурс:

  1. Как установить заголовок Content-Type в правиле ошибки
Другие вопросы по тегам