在现有Web Service中更改xs:complexType

时间:2013-09-10 05:08:03

标签: xsd wsdl

我有一个现有的Web服务,其complexType为 return 值。

<xs:complexType name="dummy">
  <xs:sequence>
    <xs:element minOccurs="0" maxOccurs="1" name="A" type="xs:string" /> 
  </xs:sequence>
</xs:complexType>

稍后(在一些客户端处于生产阶段之后)我想扩展我的Webservice。 详细信息我想添加一个复杂类型的新可选子元素:

<xs:complexType name="dummy">
  <xs:sequence>
    <xs:element minOccurs="0" maxOccurs="1" name="A" type="xs:string" /> 
    <xs:element minOccurs="0" maxOccurs="1" name="B" type="xs:string" /> 
  </xs:sequence>
</xs:complexType>

我是否打破现有客户?如果是,那么处理现有Web服务增强功能的正确/通常方法是什么?

1 个答案:

答案 0 :(得分:1)

以你的问题文学作为答案是

Java客户端基于生成的代码,并且它们验证实际合同是否与生成客户端的合同相匹配。我通过添加新方法破坏了JAX-WS生成的Java客户端的合同 - 理论上这应该不是问题。但我在初始化代码中设置了端点地址。

一些未经验证的客户可以使用已更改的合同,只要它们不符合未知字段即可。在你的情况下,只要你没有显示可选的新元素,它们就会消耗这些消息,但是当消息中存在这样的元素时它们会抛出一个错误(我们的客户端有嗯......好吧..客户端,这是以这种方式运行,他们有旧的定义,但新的字段几乎总是空的 - 而不是XML中的。)

动态生成的客户端(例如在Python中)正在根据当前合同生成响应,并且因为在这些语言中,您可以向现有对象添加新字段,它们将在您的情况下正常工作。

所以答案很长:取决于客户使用合同的内容。

如何管理此类更改:这不是一个好方法,但如果您对使用的客户端和更新时间没有影响,请保留旧的Web服务并在新URL下发布新版本的paralell。