SOAP:如何在不破坏现有客户端的情况下扩展类型?

时间:2011-09-09 09:47:32

标签: java soap wsdl axis2

我有一个使用Apache Axis 2实现的SOAP服务。它的类型Message具有以下定义

<xs:complexType name="Message">
  <xs:sequence>
    <xs:element minOccurs="0" name="id" type="xs:int"/>
    <xs:element minOccurs="0" name="caption" nillable="true" type="xs:string"/>
    <xs:element minOccurs="0" name="text" nillable="true" type="xs:string"/>
    <xs:element minOccurs="0" name="source" nillable="true" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

我必须使用对复杂类型source的引用替换Source元素。在避免破坏现有客户的同时,最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

Martin Fowler提供了一篇关于schema versioning and extension points的精彩文章。 Neverthess,因为你今天没有扩展点,所以这不适合你。业界大量使用的方法是在给定的时间点拥有多个版本的WSDL和XSD。因此,如果使用四个组件指定Web服务:

  1. 描述数据模型的XML架构(xsd)
  2. 使用XSD描述Web服务的WSDL +绑定
  3. 用Java实现的服务提供程序(生成的代码,例如JAX-WS)
  4. 服务实施,'以某种方式'从#3
  5. 中解脱出来

    并且您需要引入非向后兼容的更改,您可以复制组件#1和#2并为它们定义另一个命名空间,例如: "http://www.example.org/abc_v2"。您必须为新版本的服务(#3)生成提供程序,并且“以某种方式”将其与组件#4集成 - 毫无疑问,这是丑陋的部分。

    这种方法很有效,但是复制很多想要维护的代码并不好。如果您遵循此方法,则应为仍使用服务版本1的所有客户端定义截止日期,以便稍后可以删除重复的代码。

    总而言之,不是很好,而是一个选项。