我有一个具有相同操作名称和请求参数名称的WSDL文件。当我使用WSDL文件生成客户端存根时,port类生成一个具有void返回类型的方法。此外,请求参数从单个对象更改为该单个对象的内容。
将WSDL文件上的操作名称更改为其他名称。但是,我认为修改WSDL文件是一种不好的做法。此外,我无法访问实际的Web服务。因此,我也无法更改Web服务上的实际操作名称。
是否存在wsimport
不会与操作名称和请求参数名称混淆的方法?我尝试在wsimport中使用-B-XautoNameResolution
属性,但它没有解决问题。
我的WSDL文件如下所示:(如您所见,操作名称和请求参数名称都使用名称'transact')
<xsd:schema targetNamespace="http://com.example">
<xsd:element name="transact">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="from" type="xsd:string"></xsd:element>
<xsd:element name="to" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<wsdl:message name="requestdata">
<wsdl:part element="tns:transact" name="parameters"/>
</wsdl:message>
<wsdl:message name="responsedata">
<wsdl:part element="tns:responsedata" name="parameters"/>
</wsdl:message>
<wsdl:portType name="portname">
<wsdl:operation name="transact">
<wsdl:input message="tns:requestdata"/>
<wsdl:output message="tns:responsedata"/>
</wsdl:operation>
</wsdl:portType>
结果类是这样的:(返回类型为void,即使输入类型在RequestWrapper
中声明,但是transact方法中声明的方法不是对象本身。)
@WebMethod(action = "http://com.example/transact")
@RequestWrapper(localName = "transact", targetNamespace = "http://com.example", className = "com.example.Transact")
@ResponseWrapper(localName = "transactresponse", targetNamespace = "http://com.example", className = "com.example.TransactResponse")
public void transact(
@WebParam(name = "to", targetNamespace = "")
String to,
@WebParam(name = "from", targetNamespace = "")
String from);
答案 0 :(得分:0)
此应用程序正常运行。 你所做的是包装风格的参数处理。 其他样式是裸样式(单个部分争论导致1个java对象)
当输入消息的单部分的元素名称与操作名称相同时,它在解析SOAP请求到Java时产生多个参数,而不是1个封装的Java对象。 这被称为参数处理的“包装样式”。
<wsdl:part element="tns:transact" name="parameters"/>
<wsdl:operation name="transact">
WSDL绑定类型仍然是“文档样式”,因为我们使用单部分(XSD中的复杂类型)
参考URL:
https://myarch.com/wrappernon-wrapper-web-service-styles-things-you-need-to-know/
http://www.ibm.com/developerworks/library/ws-usagewsdl/
解决方案是更改以下2个XML条目
<xsd:element name="transactNew">
<wsdl:part element="tns:transactNew" name="parameters"/>
将 transact 更改为 transactNew 将使其与OperationName(transact)不同,从而解决问题,因为Operation Name和Single Arguement Name现在不同了。