SOAP请求中MTOM附件未送达WebService,DataHandler为空问题求助
JAX-WS实现的MTOM配置遗漏:不同JAX-WS实现(如Metro、CXF、Axis2)需额外配置。比如CXF要在端点配置中显式开启MTOM,Spring环境下需添加:
<jaxws:endpoint ...> <jaxws:properties> <entry key="mtom-enabled" value="true"/> </jaxws:properties> </jaxws:endpoint>Metro则可能需要在
sun-jaxws.xml中设置mtom-enabled="true",仅在方法上加@MTOM(enabled=true)可能无法生效。请求Content-Type头不符合要求:MTOM要求请求头必须是
multipart/related; type="application/xop+xml"; start="<rootpart>"; start-info="text/xml"; boundary="..."。若客户端发送的Content-Type不匹配,服务器会忽略附件,导致DataHandler为空,可通过抓包工具(如Wireshark、Fiddler)验证。XSD与Java实体类映射不一致:XSD中
xmime:expectedContentTypes的取值必须和Java实体类@XmlMimeType的参数完全一致,比如XSD定义xmime:expectedContentTypes="application/pdf",Java里就得写@XmlMimeType("application/pdf")。同时确保字段类型是DataHandler而非byte[],否则MTOM逻辑不触发。客户端MTOM发送配置错误:客户端未正确启用MTOM时,即便请求包含
<inc:Include>标签,附件也可能未正确嵌入multipart请求。JAX-WS客户端需调用:bindingProvider.getRequestContext().put(JAXWSProperties.MTOM_THRESHOLD, 0);或在客户端代码中添加
@MTOM(enabled=true)注解强制启用。服务器端拦截器/过滤器干扰:自定义SOAP拦截器、HTTP过滤器若提前读取请求流,会导致后续JAX-WS无法读取附件数据。检查是否有组件修改了请求输入流,或处理MTOM消息时出现逻辑错误。
CID引用格式不匹配:
<inc:Include href="cid:...">中的CID必须和multipart请求里附件的Content-ID完全一致,包括大小写和符号格式。比如附件Content-ID是<file@example.com>,href需写cid:file@example.com(去掉尖括号),格式不匹配会导致服务器无法关联附件。容器层面未开启MTOM支持:部分应用服务器(如WebLogic、WebSphere)需在容器配置中开启MTOM,而非仅靠代码注解。比如WebLogic要在
weblogic.xml中添加<mtom-enabled>true</mtom-enabled>,否则容器会忽略MTOM处理逻辑。
内容的提问来源于stack exchange,提问作者Luki

