2

我有一个 .NET WCF 服务和一个使用 Axis2 生成服务存根的 Java 应用程序。当我将可选属性添加到 WCF 中的数据协定并在属性列表的末尾对其进行排序(这应该是向后兼容的更改)时,它会导致Java 应用程序中出现意外的子元素错误。修复它的唯一方法是在 Axis2 中重新生成存根并重新部署 Java 应用程序——在我的情况下,这不是可接受的方法。

需要明确的是,我没有更改属性的顺序并且 WSDL 是有效的。这是之前(Java 应用程序工作时)和之后(导致“意外子元素”错误)的 WSDL 类型的示例:

<!-- 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: Unexpected subelement {http://mycompany.com/services/}MyNewProperty

我们可以用 Axis2 做些什么来防止这种情况发生吗?如果没有,我们应该在 WSDL 或 WCF 方面做些什么不同的事情?

4

1 回答 1

3

从 XML Schema 的角度来看,这似乎不是向后兼容的更改。如果我要求 XSV 验证消息

<MyObject>
    <Name>Primus Secundus</Name>
    <MyNewProperty>Addita notitia</MyNewProperty>
</MyObject> 

针对您的 <!-- BEFORE --> 架构,我收到一条错误消息,表明 MyNewProperty 无效:

每个 cvc-complex-type.1.2.4 无效:元素 {None}:MyNewProperty 此处不允许 (2) 在元素 {None}:MyObject 中,需要 [$]:

我在 XML Schema 文档 ( http://www.w3.org/TR/xmlschema-1/ ) 或 SOAP 版本 ( http://www.w3.org/TR/soap/ )中找不到任何内容这表明应该允许为新属性扩展具有新元素的序列。


我在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>
于 2013-07-09T18:24:20.903 回答