编译共享公共模式的多个WSDL

时间:2013-06-10 08:32:44

标签: java web-services

我有两个网络服务。两者都是由应用程序实现的,因此有一些共同的对象。  我有一个使用两个web服务的GWT前端。在这里,当我使用maven wsimport生成webserive类时。我在两个不同的包中得到了这些相同类的副本。我不想创建这些类的重复项。所以创建了这些类的绑定。但每次Web服务发生任何变化时。我已经调整了绑定中定义的类,我想避免使用它。

我的问题是。有没有更好的方法来处理这些常见的类?

1 个答案:

答案 0 :(得分:0)

完全可以在两个或多个Web服务上使用公共bean。您只需要在两个服务导入的xsds中声明类型。例如,考虑这个名为Common.xsd的xsd,它包含某些服务的公共类型

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                         xmlns:tns="http://www.foo.com/ws/common"
                         targetNamespace="http://www.foo.com/ws/common"
                         elementFormDefault="qualified">

    <xsd:element name="Address" type="tns:Address"/>
    <xsd:element name="MyWsFault" type="tns:MyWsFault" />

    <xsd:complexType name="Address">
        <xsd:sequence>
            <xsd:element name="city" type="xsd:string" minOccurs="0"/>
            <xsd:element name="country" type="xsd:string" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="MyWsFault">
        <xsd:sequence>
            <!-- whatever you want to encapsulate in case of an error -->
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

现在,对于类型Address,将会有一个使用完全限定名称生成的单个类com.foo.ws.common.Address

为了完整起见,请考虑以下服务返回一个地址(为简单起见,输入未指定)。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:cmn="http://www.foo.com/ws/common"  
                  xmlns:tns="http://www.foo.com/ws"
                  targetNamespace="http://www.foo.com/ws">

    <wsdl:types>
        <xsd:schema>
            <xsd:import namespace="http://www.foo.com/ws/common" schemaLocation="Common.xsd" />
        </xsd:schema>
    </wsdl:types>

    <wsdl:message name="GetAddressRequest">
        <!-- request input here -->
    </wsdl:message>

    <wsdl:message name="GetAddressResponse">
        <wsdl:part name="Address" element="cmn:Address" />
    </wsdl:message>

    <wsdl:message name="MyWsException">
        <wsdl:part name="MyWsFault" element="cmn:MyWsFault" />
    </wsdl:message>

    <wsdl:portType name="GetAddressPortType">
        <wsdl:operation name="GetAddress">
            <wsdl:input message="tns:GetAddressRequest" name="GetAddressRequest"/>
            <wsdl:output message="tns:GetAddressResponse" name="GetAddressResponse"/>
            <wsdl:fault message="tns:MyWsException" name="MyWsException"/>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="GetAddressBinding" type="tns:GetAddressPortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="GetAddress">
            <soap:operation soapAction="GetAddress"/>
            <wsdl:input name="GetAddressRequest">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="GetAddressResponse">
                <soap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="MyWsException">
                <soap:fault name="MyWsException" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="GetAddressService">
        <wsdl:port binding="tns:GetAddressBinding" name="GetAddressPort">
            <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
        </wsdl:port>
    </wsdl:service>

</wsdl:definitions>

IIRC在Spring上有一个非常好的资源用于合同优先的Web服务,您可能需要检查它。