在xsd选择扩展的情况下,Web Service操作输出消息的向后兼容性

时间:2013-04-30 09:38:03

标签: xsd wsdl

我对输出消息中的选择上下文中的Webservice接口的向后兼容性有疑问。无法真正找到答案。

假设我有一个带有“getData”操作的Web服务,它有以下响应消息(这是Web服务的V1)。响应消息包括一个选择元素,它返回“指令”或“密钥转换”的有效载荷。这个V1 WSDL被各种消费者使用,它们生成java绑定并在生产中推出应用程序。

<xsd:complexType name="GetInstructionListResponse">
    <xsd:sequence>
        <xsd:element name="ContinueInfo" type="tns:ContinueInfo" form="qualified" />
        <xsd:element name="ResultLength" type="xsd:integer" form="qualified" />
        <xsd:element name="Payload">
          <xsd:complexType>
            <xsd:choice>
                <xsd:element name="DataObjectList1" type="tns:Instruction" form="qualified" minOccurs="1" maxOccurs="50" />
                <xsd:element name="DataObjectList2" type="tns:KeyTranslation" form="qualified" minOccurs="1" maxOccurs="50" />
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="ReturnCodeList" type="tns:ReturnCodeList" form="qualified" minOccurs="0">
            <xsd:annotation>
                <xsd:documentation>Description: List of error descriptions</xsd:documentation>
            </xsd:annotation>
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>

作为此界面的提供者,我们现在将推出V1推出后的第三个选择元素“Advise”。

    <xsd:complexType name="GetInstructionListResponse">
    <xsd:sequence>
        <xsd:element name="ContinueInfo" type="tns:ContinueInfo" form="qualified" />
        <xsd:element name="ResultLength" type="xsd:integer" form="qualified" />
        <xsd:element name="Payload">
          <xsd:complexType>
            <xsd:choice>
                <xsd:element name="DataObjectList1" type="tns:Instruction" form="qualified" minOccurs="1" maxOccurs="50" />
                <xsd:element name="DataObjectList2" type="tns:KeyTranslation" form="qualified" minOccurs="1" maxOccurs="50" />
                <xsd:element name="DataObjectList2" type="tns:Advice" form="qualified" minOccurs="1" maxOccurs="50" />
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="ReturnCodeList" type="tns:ReturnCodeList" form="qualified" minOccurs="0">
            <xsd:annotation>
                <xsd:documentation>Description: List of error descriptions</xsd:documentation>
            </xsd:annotation>
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>

现在的问题是,输出消息中的这种变化是一个重大变化,即现有的消费者(使用不需要新选择元素的V1)必须做任何事情(例如重新生成java绑定,任何编组问题?)如果我们将这个扩展响应结构的V1 WSDL提供者接口替换为提供者,或者只要他在处理中不需要第三个选择元素就可以对他透明?

2 个答案:

答案 0 :(得分:1)

通过严格的定义,我认为这是一个重大改变。通过“严格”,我的意思是可以编写一个在更改之前工作的程序,并在更改之后中断。任何在改变之前都会收到两个原始选择之一的程序,但现在将收到第三个选择 - 该程序将被破坏。

此外,任何可以读取WSDL的程序都会看到它发生了变化。如果WSDL发生变化,可以合理地允许这样的程序“中断”。

请记住,在Visual Studio中使用wsdl2java或“Add Service Reference”等工具时,代码是从WSDL编写的。 WSDL中的更改将导致生成的代码发生更改。不要轻视你可能在他们不知情的情况下改变某人的代码。

答案 1 :(得分:0)

与此同时,我正在设置一个测试台(Eclipse,ApacheV6,Axis2),并且正在进行测试:

  • 让客户端使用服务器V1的WSDL java绑定(两个选择元素)
  • 使用WSDL V2实现运行的服务器有三个选择。
  • 结果:Java客户端仍然可以连接并从V2服务器返回两个选择元素的正确结果(没有编组问题,无需重新编译)。