MTOM - 根内容类型始终为text / xml

时间:2016-03-29 12:00:20

标签: java soap websphere websphere-liberty mtom

我正在使用MTOM将附件从客户端流式传输到服务器。

应用MTOM并将文件作为二进制流传输。但根Content-Type始终是" text / xml" ,应该是" application / xml + xop"。

问题仅出现在 websphere 中。内容类型在websphere中设置为" text / xml"

websphere liberity个人资料中,内容类型设置为" 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 个答案:

答案 0 :(得分:1)

我收集了几个答案。希望第一个答案适合你。为了预防措施,我还添加了一些链接的其他答案。希望它会拯救你。

ANS-1:

服务器端(Weblogic中的JAX-WS)

使用@MTOM注释或mtom.xml政策

客户端(Weblogic中的JAX-WS)

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

通过SOAPUI的MTOM附件,3个步骤:

    请求属性中的
  1. Set Enable MTOM = true
  2. 上传附件(例如A3.pdf),注意contentID
  3. 在xml请求中设置MTOM contentID
  4. 以下是带有weblogic图像的完整示例。希望它适合您的问题。(Sending attachment: MTOM / XOP vs SWA and inline attachment的链接)

    另一个资源链接:

    1. Steps to Use MTOM/XOP to Send Binary Data
    2. Error consuming webservice, content type “application/xop+xml” does not match expected type “text/xml”
    3. ANS-2:

      拉入saaj-impl 1.3.23并优先选择javax.xml.soap.*的应用类来解决此问题。

      资源链接:https://jira.spring.io/browse/SWS-855

      ANS-3:

      来自mkyong的tutorial,可以解决在客户端和服务器上启用mtom的问题。

      在服务器上启用MTOM:

      启用服务器通过MTOM发送附件非常简单,只需使用javax.xml.ws.soap.MTOM注释Web服务实现类。

      在客户端启用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" %>放在最前面。

      使用Servlet时,

      你应该response.setCharacterEncoding("UTF-8");

      两者都会在内容类型标头中隐式设置正确的字符集。您可能会发现本文很有用:Unicode - How to get characters right?。对于JSP / Servlet解决方案,请从this chapter开始。

      资源链接:

      1. How to set the "Content-Type ... charset" in the request header using a HTML link
      2. 对于研究,您可以通过以下方式

        对于Java servlet,您应该有

        response.setContentType("text/html");

        位于doGetdoPost方法的顶部,其中响应是对HttpServletResponse的引用。

        相关链接:

        1. How to set up your server to send the correct MIME types
        2. Character Encoding problem with IBM's JSF and Ajax
        3. 另一个答案

          我已经弄明白是什么导致了这个问题,但我不明白为什么。当请求出现错误操作时,该行为就会出现。附件是一个简单的MPG的zip,带有请求,响应和错误规则,以证明这一点。该请求有一个错误操作,一个执行dp:reject(强制错误)的简单xform,以及一个结果操作。错误规则包含结果操作和set var操作。如果您保留on-error in,则响应内容类型将返回为&#34; text / xml&#34;。如果删除on-error,则content-type会正确返回&#34; application / json&#34;。 (从以下资源链接复制)

          资源链接:

          1. How to set header Content-Type in error rule

答案 1 :(得分:1)

能够使用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>