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

在xsd选择扩展的情况下Webservice操作输出消息的向后兼容性,xsd,wsdl,Xsd,Wsdl,我有一个关于Webservice接口在输出消息中的选择上下文中的向后兼容性的问题。我真的找不到答案 让我们假设我有一个带有操作“getData”的Webservice,该操作具有以下响应消息(这是Webservice的V1)。响应消息包括一个选择元素,该元素返回“指令”或“键翻译”的有效负载。该v1wsdl由各种消费者使用,这些消费者正在生成java绑定并在生产中推出应用程序 <xsd:complexType name="GetInstructionListResponse">

我有一个关于Webservice接口在输出消息中的选择上下文中的向后兼容性的问题。我真的找不到答案

让我们假设我有一个带有操作“getData”的Webservice,该操作具有以下响应消息(这是Webservice的V1)。响应消息包括一个选择元素,该元素返回“指令”或“键翻译”的有效负载。该v1wsdl由各种消费者使用,这些消费者正在生成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推出后引入第三选择元素“advice”

    <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>

描述:错误描述列表

现在的问题是,输出消息中的这一更改是否是一个突破性的更改,即现有的使用者(使用不需要新的choice元素的V1)是否必须做任何事情(例如,重新生成java绑定、任何编组问题?)如果我们将V1 WSDL提供程序接口替换为一个提供程序,使用这种扩展的响应结构,或者只要他在处理过程中不需要第三选择元素,这对他来说是透明的?

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

  • 拥有一个使用服务器V1的WSDL java绑定的客户端(两个可选元素)
  • 使用WSDLV2实现运行的服务器有三种选择
  • 结果:Java客户端仍然可以连接,并从V2服务器返回两个choice元素的正确结果(没有编组问题,不需要重新编译)
与此同时,我正在建立一个测试平台(Eclipse、ApacheV6、Axis2)并运行一个测试:

  • 拥有一个使用服务器V1的WSDL java绑定的客户端(两个可选元素)
  • 使用WSDLV2实现运行的服务器有三种选择
  • 结果:Java客户端仍然可以连接,并从V2服务器返回两个choice元素的正确结果(没有编组问题,不需要重新编译)
      严格地说,我认为这是一个突破性的变化。我所说的“严格”,是指可以编写一个程序,在更改之前工作,在更改之后中断。任何在更改之前会收到两个原始选择中的一个,但现在将收到第三个选择的程序-此程序将被破坏

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


      请记住,在VisualStudio中使用wsdl2java或“添加服务引用”等工具时,代码是从WSDL编写的。WSDL中的更改将导致生成的代码中的更改。不要掉以轻心,你可能会在别人不知情的情况下更改他们的代码。

      严格地说,我称之为破坏性更改。我所说的“严格”,是指可以编写一个程序,在更改之前工作,在更改之后中断。任何在更改之前会收到两个原始选择中的一个,但现在将收到第三个选择的程序-此程序将被破坏

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


      请记住,在VisualStudio中使用wsdl2java或“添加服务引用”等工具时,代码是从WSDL编写的。WSDL中的更改将导致生成的代码中的更改。不要掉以轻心,你可能会在别人不知情的情况下更改他们的代码。

      第三个选项发生了什么?我必须在这里更具体一点:web服务使用者/客户机及其V1接口正在作为输入参数传入,他希望数据存储在选项元素1或选项元素2中。对der V2提供程序接口执行的两个请求都将返回选择元素1或选择元素2。因此服务器逻辑V1没有改变,只有服务器逻辑现在(对于V2的消费客户端)会传回选择元素3(如果这样的客户端在其输入请求中传递此信息)。因此,选择元素3对V1接口使用者是透明的。第三个选择发生了什么?这里我必须更具体一些:具有V1接口的web服务使用者/客户端作为输入参数传入,他希望数据存储在选择元素1或选择元素2中。对der V2提供程序接口执行的两个请求都将返回选择元素1或选择元素2。因此服务器逻辑V1没有改变,只有服务器逻辑现在(对于V2的消费客户端)会传回选择元素3(如果这样的客户端在其输入请求中传递此信息)。因此,选择元素3对V1接口消费者是透明的。严格地说,你是对的。在我的实际案例中,使用者必须将输入参数传递给操作(枚举),在该操作中,使用者必须告诉他要获取哪个choice元素。这意味着这样的消费者永远不会知道,也永远不会得到第三个choice元素,因为在其java绑定中,choice元素enum选择器只允许选择V1 choice元素。万一他想请求