1

我有一个具有相同操作名称和请求参数名称的 WSDL 文件。当我使用 WSDL 文件生成客户端存根时,端口类会生成一个返回类型为 void 的方法。此外,请求参数从单个对象更改为该单个对象的内容。

将 WSDL 文件上的操作名称更改为不同的名称是可行的。但是,我认为修改 WSDL 文件是一种不好的做法。此外,我无法访问实际的 Web 服务。因此,我也无法更改 Web 服务上的实际操作名称。

有没有一种wsimport不会与操作名称和请求参数名称混淆的方法?我尝试-B-XautoNameResolution在 wsimport 中使用该属性,但它没有解决问题。

我的 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);
4

1 回答 1

0

此应用程序正在正常工作。您所做的是参数处理的包装器样式。另一种风格是裸风格(单部分争论导致 1 个 java 对象)

当输入消息的单个部分的元素名称与操作名称相同时,它在将 SOAP 请求解组到 Java 时产生多个参数,而不是 1 个封装的 Java 对象。这被称为参数处理的“包装风格”。

<wsdl:part element="tns:transact" name="parameters"/>
<wsdl:operation name="transact">

WSDL 绑定类型仍然是“文档样式”,因为我们使用的是单部分(XSD 中的复杂类型)

参考网址:
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) 不同,从而解决操作名称和单一参数名称现在不同的问题。

于 2015-07-20T12:10:08.503 回答