Spring SOAP请求编组问题:如何强制将长数据内联(JAXB2 & MTOM)
Spring SOAP请求编组问题:如何强制将长数据内联(JAXB2 & MTOM)
我之前也碰到过一模一样的头疼问题!老SOAP服务完全不支持MTOM,非得把大段二进制数据直接塞在SOAP Body里,可Spring默认会把超过一定大小的二进制数据自动转成MTOM附件,根本不符合服务端的要求。折腾了好一阵,终于找到几个靠谱的解决办法,分享给你:
方法一:全局关闭MTOM支持
如果你的整个服务调用都不需要用MTOM,最直接的就是在Spring的Marshaller配置里明确关闭MTOM功能。
比如在配置类里:
@Bean public Jaxb2Marshaller marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("com.your.company.xsd.portals.v4_0"); // 替换成你的JAXB上下文路径 marshaller.setMtomEnabled(false); // 关键:关闭MTOM,所有二进制数据都会内联 return marshaller; }
要是用Spring Boot的话,更简单,直接在application.properties里加两行配置:
spring.ws.marshaller.mtom-enabled=false spring.ws.unmarshaller.mtom-enabled=false
方法二:针对性调整实体类字段
如果你的场景是部分字段需要MTOM、部分要内联,那就得修改JAXB实体类的注解:
- 检查生成的实体类(比如
BinaryData类)里的blob字段,如果有@XmlAttachmentRef注解,一定要删掉——这个注解就是告诉JAXB把数据转成MTOM附件的元凶。 - 换成普通的
@XmlElement注解,确保字段被序列化为Base64字符串直接放在SOAP Body里:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "blob", "extension" }) public class BinaryData { @XmlElement(required = true) protected byte[] blob; // 用byte[]类型,直接序列化为Base64内联 @XmlElement(required = true) protected String extension; // 这里省略getter和setter方法 }
额外注意点
- 要是你用
wsimport或者Maven的jaxb插件生成实体类,记得在生成时加上参数禁用MTOM,避免自动生成@XmlAttachmentRef注解。比如Maven插件里可以加:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.14.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory> <generatePackage>com.your.company.xsd.portals.v4_0</generatePackage> <args> <arg>-no-mtom</arg> <!-- 禁用MTOM生成 --> </args> </configuration> </plugin>
- 别忘记测试!修改完之后抓个SOAP请求包,确认
blob字段里的长数据确实是直接内联在<blob>标签里,而不是变成MTOM的<xop:Include>引用。
备注:内容来源于stack exchange,提问作者Kira Resari
相关产品推荐
相关产品推荐

