我有两个网络服务。两者都是由应用程序实现的,因此有一些共同的对象。 我有一个使用两个web服务的GWT前端。在这里,当我使用maven wsimport生成webserive类时。我在两个不同的包中得到了这些相同类的副本。我不想创建这些类的重复项。所以创建了这些类的绑定。但每次Web服务发生任何变化时。我已经调整了绑定中定义的类,我想避免使用它。
我的问题是。有没有更好的方法来处理这些常见的类?
答案 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服务,您可能需要检查它。