我对输出消息中的选择上下文中的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提供者接口替换为提供者,或者只要他在处理中不需要第三个选择元素就可以对他透明?
答案 0 :(得分:1)
通过严格的定义,我认为这是一个重大改变。通过“严格”,我的意思是可以编写一个在更改之前工作的程序,并在更改之后中断。任何在改变之前都会收到两个原始选择之一的程序,但现在将收到第三个选择 - 该程序将被破坏。
此外,任何可以读取WSDL的程序都会看到它发生了变化。如果WSDL发生变化,可以合理地允许这样的程序“中断”。
请记住,在Visual Studio中使用wsdl2java或“Add Service Reference”等工具时,代码是从WSDL编写的。 WSDL中的更改将导致生成的代码发生更改。不要轻视你可能在他们不知情的情况下改变某人的代码。
答案 1 :(得分:0)
与此同时,我正在设置一个测试台(Eclipse,ApacheV6,Axis2),并且正在进行测试: