将类型从两个WSDL映射到一个Java类

时间:2011-09-05 13:14:14

标签: jax-ws

我正在使用一家公司的两个网络服务,每个公司都有自己的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类?

1 个答案:

答案 0 :(得分:0)

您需要问自己的问题是:只有一个类适用于两个不同的Web服务是一个好主意吗?如果您有一个班级,如果其中一家公司更改其服务会发生什么。您不仅需要修改其ws的界面,还要修改第二个公司的界面。

您可以认为您希望尽可能多地分解代码,但从长远来看,将这两个Web服务捆绑在一起可能不是一个好主意。接口可能随时间移动。我认为在这种情况下复制代码是可以接受的。

你可能已经想过这个,但我要做的是使用适配器模式。所以你会有三个类:代码中到处使用的泛型类(GenericErrorList);和两个从各自的wsdls(CompanyOneErrorList和CompanyTwoErrorList)生成的。有一种转换方法,它接受CompanyOneErrorList并创建GenericErrorList。对于另一家公司也一样。

除非你有充分的理由将这两个实现结合在一起,否则我会避免这样做。