You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实体类的注解:

  1. 检查生成的实体类(比如BinaryData类)里的blob字段,如果有@XmlAttachmentRef注解,一定要删掉——这个注解就是告诉JAXB把数据转成MTOM附件的元凶。
  2. 换成普通的@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 13:39:27