我正在使用一家公司的两个网络服务,每个公司都有自己的wsdl。我正在使用wsimport生成java类。
我发现两个wsdl中存在很多重叠,但使用的名称不同。例如,当发生错误时,两个服务都返回错误消息列表。但是这两个服务对返回的列表使用不同的名称。请参阅wsdl的两个小节
.
.
<s:element name="LoadResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="LoadResult" type="tns:ArrayOfMessageOfHierarchyLoadMessage" />
<s:element minOccurs="0" maxOccurs="1" name="hierarchy" type="tns:Hierarchy" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfHierarchyLoadMessage">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="HierarchyLoadMessage" nillable="true" type="tns:HierarchyLoadMessage" />
</s:sequence>
</s:complexType>
<s:complexType name="HierarchyLoadMessage">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Type" type="tns:MessageType" />
<s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Parameters" type="tns:ArrayOfString" />
</s:sequence>
</s:complexType>
.
.
和另一个wsdl的小节
.
.
<s:element name="SearchResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="SearchResult" type="tns:ArrayOfMessageOfErrorCodes" />
<s:element minOccurs="0" maxOccurs="1" name="data" type="tns:FinderData" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfErrorCodes">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="ErrorCodes" nillable="true" type="tns:ErrorCodes" />
</s:sequence>
</s:complexType>
<s:complexType name="ErrorCodes">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Type" type="tns:MessageType" />
<s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Parameters" type="tns:ArrayOfString" />
</s:sequence>
</s:complexType>
.
.
如您所见,重叠类型为
ArrayOfMessageOfHierarchyLoadMessage and ArrayOfMessageOfHierarchyLoadMessage
MessageOfHierarchyLoadMessage and MessageOfErrorCodes
你能告诉我是否有可能使用绑定文件在两个wsdl中映射相同的类型,这样wsimport只为它生成一个java类?
答案 0 :(得分:0)
您需要问自己的问题是:只有一个类适用于两个不同的Web服务是一个好主意吗?如果您有一个班级,如果其中一家公司更改其服务会发生什么。您不仅需要修改其ws的界面,还要修改第二个公司的界面。
您可以认为您希望尽可能多地分解代码,但从长远来看,将这两个Web服务捆绑在一起可能不是一个好主意。接口可能随时间移动。我认为在这种情况下复制代码是可以接受的。
你可能已经想过这个,但我要做的是使用适配器模式。所以你会有三个类:代码中到处使用的泛型类(GenericErrorList);和两个从各自的wsdls(CompanyOneErrorList和CompanyTwoErrorList)生成的。有一种转换方法,它接受CompanyOneErrorList并创建GenericErrorList。对于另一家公司也一样。
除非你有充分的理由将这两个实现结合在一起,否则我会避免这样做。