为什么wsimport突然生成使用包装参数的客户端代码?

时间:2014-02-03 20:34:01

标签: java web-services wsdl axis2 wsimport

几年前我用Axis2学习了Web服务,所以从那时起我一直在使用它。

我一直很讨厌Axis2使用包装参数而不是原始类型生成客户端存根。我理解当你使用复杂对象作为参数时,实际上没有选择,因为这些对象需要被序列化,但是当你的方法需要一个String并且可能返回一个String时,将它们包装在一些xxx.yyy.Get和xxx.yyy中.GetResponse参数对我来说似乎有些过分。由于我现在在我的所有服务上使用JSON作为输入和输出,所以我只使用字符串。

后来在我的学习中,我发现我仍然可以使用Eclipse的Axis2插件创建我的服务,但是我没有使用Axis2存根,而是使用Java JDK的wsimport工具来创建客户端,而不会包含所有包装类型的混乱。< / p>

因此,对于服务方法“String getData(String param)”,我可以进行一个看起来像“servicePort.getData(stringParam)”的客户端调用,其中“stringParam”显然是一个String。

即到今天: - (

出于某种原因,今天我创建了一个新服务,将其部署在我的服务器上,并在其上调用了wsimport,但却发现生成的客户端正在使用包装类型。

例如,这是我的服务定义,我使用Eclipse的Axis2插件从中创建WSDL然后使用服务代码:

public String get(String param){
   return null;
}

而且,这是wsimport生成的客户端:

@WebMethod
@WebResult(name = "getResponse", targetNamespace = "http://...", partName = "parameters")
public GetResponse get(
    @WebParam(name = "get", targetNamespace = "http://...", partName = parameters)
    Get parameters);

在我事先编码的网络服务上,我最终得到了以下客户端代码:

@WebMethod(action = "urn:get")
@WebResult(targetNamespace = "http://...")
@RequestWrapper(localName = "get", targetNamespace = "http://...", className = "xxx.yyy.Get")
@ResponseWrapper(localName = "getResponse", targetNamespace = "http://...", className = "xxx.yyy.GetResponse")
public String get(
    @WebParam(name = "param", targetNamespace = "http://...")
    String param);

这是我用来生成客户端的wsimport命令(在Windows上,来自我的JDK的bin目录):

.\wsimport -p <package name> -s <target src directory> -extension -verbose -Xnocompile <webserviceUrl?wsdl>

和wsdl:

<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xsd="http://..." xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://...">
<wsdl:types>
    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://...">
        <xs:element name="get">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="param" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="getResponse">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
</wsdl:types>
<wsdl:message name="getRequest">
    <wsdl:part name="parameters" element="xsd:get"/>
</wsdl:message>
<wsdl:message name="getResponse">
    <wsdl:part name="parameters" element="xsd:getResponse"/>
</wsdl:message>
<wsdl:portType name="ServicePortType">
    <wsdl:operation name="get">
        <wsdl:input message="xsd:getRequest" wsaw:Action="urn:get"/>
        <wsdl:output message="xsd:getResponse" wsaw:Action="urn:getResponse"/>
    </wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ServiceSoap11Binding" type="xsd:ServicePortType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <wsdl:operation name="get">
        <soap:operation soapAction="urn:get" style="document"/>
        <wsdl:input>
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:binding name="ServiceSoap12Binding" type="xsd:ServicePortType">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <wsdl:operation name="get">
        <soap12:operation soapAction="urn:get" style="document"/>
        <wsdl:input>
            <soap12:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap12:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:binding name="ServiceHttpBinding" type="xsd:ServicePortType">
    <http:binding verb="POST"/>
    <wsdl:operation name="get">
        <http:operation location="get"/>
        <wsdl:input>
            <mime:content type="application/xml" part="parameters"/>
        </wsdl:input>
        <wsdl:output>
            <mime:content type="application/xml" part="parameters"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:service name="Service">
    <wsdl:port name="ServiceHttpSoap11Endpoint" binding="xsd:ServiceSoap11Binding">
        <soap:address location="http://localhost:8080/axis2/services/Service"/>
    </wsdl:port>
    <wsdl:port name="ServiceHttpSoap12Endpoint" binding="xsd:ServiceSoap12Binding">
        <soap12:address location="http://localhost:8080/axis2/services/Service"/>
    </wsdl:port>
    <wsdl:port name="ServiceHttpEndpoint" binding="xsd:ServiceHttpBinding">
        <http:address location="http://localhost:8080/axis2/services/Service"/>
    </wsdl:port>
</wsdl:service>

我在StackOverflow和其他论坛上找到了其他问题和答案,在自定义绑定文件中的“enableWrapperStyle”事情,试过它,没有用。无论如何,这个标志似乎允许生成带有包装类型的方法签名(我不想要),或签名返回void并在签名中使用一些Holder类型返回值(我也不想要)。

有人能告诉我我做错了吗?

0 个答案:

没有答案