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
相关产品推荐
相关产品推荐

