轴2:避免"意外的子元素"将非必需属性添加到WSDL时出错

时间:2013-07-08 17:14:23

标签: java wcf wsdl axis2

我有一个.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方面做些什么?

1 个答案:

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