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 шага:
Set Enable MTOM = true
в свойствах запроса- Загрузите вложение (например, A3.pdf), обратите внимание на contentID
- Установите MTID contentID в запросе xml
Вот полный пример с изображениями с weblogic. Надеюсь, что это будет соответствовать вашей проблеме.(Ссылка для отправки вложения: MTOM / XOP против SWA и встроенного вложения)
Другая ссылка на ресурс:
- Шаги по использованию MTOM / XOP для отправки двоичных данных
- Ошибка при использовании веб-службы, тип содержимого "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 начните с этой главы.
Ссылка на ресурс:
Для исследования вы можете пройти через следующие
Для сервлета Java у вас должна быть строка
response.setContentType("text/html");
в верхней части вашего doGet
или же doPost
метод, где ответ является ссылкой на HttpServletResponse
,
Ссылка по теме:
- Как настроить сервер для отправки правильных типов MIME
- Проблема кодировки символов в IBM JSF и Ajax
Другой ответ
Я выяснил, что является причиной проблемы, но я не понимаю, почему. Поведение проявляет себя, когда есть запрос на ошибку по запросу. Прикрепленный почтовый индекс простой MPG с правилом запроса, ответа и ошибки, которые демонстрируют это. Запрос имеет действие по ошибке, простую форму xform, которая выполняет команду dp:reject (чтобы вызвать ошибку), и действие результатов. Правило ошибки имеет действие результатов и заданное действие var. Если вы оставите on-error в, тип содержимого ответа будет возвращен как "text/xml". Если вы удалите сообщение об ошибке, тип содержимого правильно вернет "application/json". (Скопировано из следующей ссылки на ресурс)
Ссылка на ресурс: