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

JAXB无法从SOAP(WSDL)服务获取附件问题求助

问题描述

调用返回附件的SOAP服务时,无法正确获取文件数据:

  • 附件数据的XSD定义:
<xs:complexType name="transferableFileData">
    <xs:complexContent>
      <xs:extension base="tns:transferableFile">
        <xs:sequence>
          <xs:element name="fileData" type="xs:base64Binary" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  • 使用maven-jaxb2-plugin生成的POJO类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "transferableFileData", propOrder = {
    "fileData"
})
public class TransferableFileData
    extends TransferableFile
{

    protected byte[] fileData;

    public byte[] getFileData() {
        return fileData;
    }

    public void setFileData(byte[] value) {
        this.fileData = value;
    }

}
  • 服务器返回MTOM格式的多部分响应(包含XOP:Include引用附件),但通过代码获取fileData时,长度始终为0:
final TransferableFileData transferableData = response.getDownloadPendingFileResult();
byte[] bytes = transferableData.getFileData();
log.info("length {}", bytes.length); // 输出长度为0
解决方案

问题根源是服务器返回的是MTOM(消息传输优化机制)格式的响应,默认的JAXB解组器不会自动解析XOP引用的附件数据,需启用客户端的MTOM支持:

1. 启用SOAP客户端的MTOM支持

原生JAX-WS客户端

// 初始化服务和端口
YourService service = new YourService();
YourPortType port = service.getYourPort();

// 启用MTOM
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext().put(JAXWSProperties.MTOM_ENABLED, true);

Spring WebServiceTemplate

配置时开启MTOM支持:

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
    <property name="marshaller" ref="jaxbMarshaller"/>
    <property name="unmarshaller" ref="jaxbMarshaller"/>
    <property name="mtomEnabled" value="true"/>
</bean>

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="your.generated.package"/>
    <property name="mtomEnabled" value="true"/>
</bean>

2. 可选:增强JAXB生成类的MTOM支持

创建binding.xjb绑定文件:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               version="2.1">
    <jaxb:globalBindings>
        <jaxb:base64BinaryMarshaller marshallerClass="com.sun.xml.bind.marshaller.MtomMarshaller"/>
    </jaxb:globalBindings>
</jaxb:bindings>

在maven-jaxb2-plugin中引用该文件:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.15.1</version>
    <configuration>
        <bindings>
            <binding>
                <fileset>
                    <directory>${basedir}/src/main/resources</directory>
                    <include>binding.xjb</include>
                </fileset>
            </binding>
        </bindings>
    </configuration>
</plugin>

3. 验证要点

  • 确保客户端请求头包含Accept: multipart/related,触发服务器返回MTOM格式响应
  • 启用日志,确认客户端正确解析多部分响应并将附件数据注入fileData字段

内容的提问来源于stack exchange,提问作者Grafana Next

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:02:09