具有相同操作名称和输入类型的WSDL会产生不正确的客户端存根?

时间:2013-05-17 07:37:23

标签: java web-services wsdl jax-ws wsimport

我有一个具有相同操作名称和请求参数名称的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);

1 个答案:

答案 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现在不同了。