我正在尝试使用CXF WSDL第一种方法来实现带有附件的Soap。Here是这样。
我用以下两种mime类型创建了肥皂绑定
<wsdl:binding name="ClaimBinding" type="tns:ClaimPortType">
<soapbind:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="SendClaim">
<soapbind:operation soapAction="http://example.com/soapaction"/>
<wsdl:input>
<mime:multipartRelated>
<mime:part name="bodyPart">
<soapbind:body use="literal"
parts="ClaimDetail"
namespace="http://example.com/mimetypes"/>
</mime:part>
<mime:part name="imageData">
<mime:content part="ClaimPhoto"
type="image/jpeg"/>
</mime:part>
</mime:multipartRelated>
</wsdl:input>
<wsdl:output>
<soapbind:body use="literal"
namespace="http://example.com/mimetypes"/>
</wsdl:output>
</wsdl:operation>
如您所见,输入有两个哑剧部分。
对于第一部分( ClaimDetail ),它具有两个元素,名称和 ClaimForm ,其中ClaimForm的类型为 swaRef 。我使用cxf wsdl2java工具生成了代码,并且生成了以下界面。
@WebService(targetNamespace = "http://example.com/mimewsdl", name = "ClaimPortType")
@XmlSeeAlso({com.example.mimetypes.ObjectFactory.class})
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface ClaimPortType {
@WebMethod(operationName = "SendClaim", action = "http://example.com/soapaction")
@WebResult(name = "ClaimRefNo", targetNamespace = "http://example.com/mimewsdl", partName = "ClaimRefNo")
public java.lang.String sendClaim(
@WebParam(partName = "ClaimDetail", name = "ClaimDetail")
com.example.mimetypes.ClaimDetailType claimDetail,
@WebParam(partName = "ClaimPhoto", name = "ClaimPhoto")
byte[] claimPhoto
);
}
当我在SOAPUI中加载wsdl时,它发出了以下请求。
我如下创建了jaxws:endpoint
<jaxws:endpoint id="claimPortType"
implementor="com.example.mimewsdl.ClaimStoragePortImpl"
address="/Claims">
</jaxws:endpoint>
当我在soapui中运行请求时,我总是得到 sendClaim 方法的 claimPhoto 参数的空值(请参见上面生成的界面)。字节数组始终为null。但是ClaimForm方法正在为 claimDetail 参数的 ClaimForm 元素获取适当的DataHandler。
这是怎么了?