我有一个.NET WCF服务和一个使用Axis2生成服务存根的Java应用程序。当我将可选属性添加到WCF中的数据协定并且在属性列表的末尾对其进行排序(这应该是向后兼容的更改)时,会导致 Java应用程序中出现意外的子元素错误。修复它的唯一方法是在Axis2中重新生成存根并重新部署Java应用程序 - 在我的情况下,这不是一种可接受的方法。
要清楚,我没有改变属性的顺序,WSDL是有效的。这是一个来自之前(当Java应用程序工作时)和之后的WSDL类型的示例(导致“Unexpected subelement”错误):
<!-- BEFORE -->
<xs:complexType name="MyObject">
<xs:sequence>
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<!-- AFTER -->
<xs:complexType name="MyObject">
<xs:sequence>
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="MyNewProperty" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
AFTER版本导致此错误: org.apache.axis2.AxisFault:org.apache.axis2.databinding.ADBException:意外的子元素{http://mycompany.com/services/} MyNewProperty
我们可以用Axis2来防止这种情况发生吗?如果没有,我们应该在WSDL或WCF方面做些什么?
答案 0 :(得分:2)
从XML Schema的角度来看,这似乎不是向后兼容的变化。如果我要求XSV验证消息
<MyObject>
<Name>Primus Secundus</Name>
<MyNewProperty>Addita notitia</MyNewProperty>
</MyObject>
反对你的&lt;! - BEFORE - &gt; schema,我收到一个错误,指示MyNewProperty无效:
每个cvc-complex-type.1.2.4无效:元素{无}:MyNewProperty不是 允许这里(2)元素{无}:MyObject,期待[$]:
我在XML Schema文档(http://www.w3.org/TR/xmlschema-1/)或SOAP版本(http://www.w3.org/TR/soap/)中找不到任何内容,这表明应该允许使用新属性的新元素扩展序列。< / p>
我在http://www.w3.org/2001/03/webdata/xsv使用了XSV,并将数据上传到以下包装器中:
<?xml version="1.0"?>
<wrapper xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="#mySchema">
<xs:schema id="mySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="wrapper">
<xs:complexType>
<xs:sequence>
<xs:any/>
<xs:element name="MyObject" type="MyObject"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- BEFORE -->
<xs:complexType name="MyObject">
<xs:sequence>
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
<MyObject>
<Name>Primus Secundus</Name>
<MyNewProperty>Addita notitia</MyNewProperty>
</MyObject>
</wrapper>