【问题标题】:Mapping types from two WSDLs to one Java class将类型从两个 WSDL 映射到一个 Java 类
【发布时间】:2011-09-05 13:14:13
【问题描述】:

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

【问题讨论】:

    标签: jax-ws


    【解决方案1】:

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

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

    您可能已经想到了这一点,但我要做的是使用适配器模式。因此,您将拥有三个类: 代码中随处使用的通用类 (GenericErrorList);和两个从各自的 wsdls(CompanyOneErrorList 和 CompanyTwoErrorList)生成。有一种转换方法采用 CompanyOneErrorList 并创建 GenericErrorList。其他公司也一样。

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

    【讨论】:

    • 马修,感谢您的快速回复。如果网络服务来自两家不同的公司,我完全同意你的看法。但是它们来自一家公司,并且由于某种未知的原因(遗留?),即使类型上有很多重叠,它们也通过两个不同的 wsdl 提供服务。所以我很确定将这些类型映射到一个java类是安全的。你知道它是怎么做的吗?
    • 不,我不知道,抱歉。您是否也不会在验证方面遇到问题?
    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多