ADBException:意外的子元素

Man*_*ngh 11 axis2 web-services exception

我创建了一个Web服务:

  • Apache Axis 2 CodeGen向导v.1.6.2(绑定:ADB)
  • Eclipse Juno
  • 雄猫7
  • Java 6

服务将自定义Java对象(DataBean)返回给客户端,但我偶然发现了客户端代码中的异常:

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message
Run Code Online (Sandbox Code Playgroud)

从我所研究的内容开始,我一再重复......我认为这是一个非常普遍的问题,但尚未就如何纠正它做出决定性的答案.

此论坛和其他论坛上的一些帖子声明需要修改WSDL(某些名称空间),或者客户端存根需要修改.有些人甚至声称亚行有一个错误.它肯定是早期版本的Axis中的一个错误,但邮件档案中有很多帖子说明错误是修复的.这些邮件存档与早期版本的Axis2有关.

现在我的问题是:

  1. 它还是一个bug吗?
  2. 在WSDL或Client存根中究竟需要更改什么?

值得一提的是,我创建了一个类似的Web服务,它将"String"返回给客户端.它工作正常!因此,当涉及复杂数据类型时,它会失败.

Apache的网站上有一些信息,标题为" 已知限制 "......

它写道:" ADB意味着'简单'的数据绑定框架,并不意味着编译所有类型的模式.以下限制是最突出的.

  1. 复杂类型扩展和限制."

那是问题吗?

以下是WSDL文件的片段,您可能对此感兴趣......

<wsdl:types>
        <xs:schema xmlns:ax26="http://mywebservice/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="schemaTargetNs">
            <xs:import namespace="http://mywebservice/xsd"/>
            <xs:element name="getMsg">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="reqData" nillable="true" type="ax25:DataBean"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="getMsgResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" nillable="true" type="ax25:DataBean"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
        <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mywebservice/xsd">
            <xs:complexType name="DataBean">
                <xs:sequence>
                    <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
    </wsdl:types>
Run Code Online (Sandbox Code Playgroud)

现在我该如何解决这个问题?我应该在这里包含一些其他代码片段吗?

Ken*_*ter 11

"意外的子元素"意味着接收者接收的消息包含接收者不期望的XML元素."{schemaTargetNs} message"是它遇到的意外元素的名称.换句话说,发送方向接收方发送了无效消息.

  • 发件人可能已经包含了一个它不应该的元素.
  • 发件人可能遗漏了强制性要素.
  • 发件人可能已将元素放入错误的顺序.
  • 发件人可能发送了完全不正确的消息.

如果服务器发出您报告的异常,则客户端向服务器发送无效消息.如果客户端发出异常,那么错误就在服务器到客户端的响应中.


小智 7

如果xsd(wsdl)对xml请求是正确的o响应是因为问题是xml元素的顺序.一个可行的解决方案是使用-Eosv选项生成您的axis2客户端.这对我有用.


Man*_*ngh 2

CodeGen(来自 WSDL)为我正在使用的 Java 对象(bean)生成的代码需要为 bean 中的字段使用不同的命名空间。不知何故,Axis 生成的代码中存在不正确的命名空间。我修复了命名空间以反映它应该是什么,并且一切正常。我可以看到人们仍在回答这个问题,所以我想我会在这里重新发布我的解决方案(已经发布了这个来回应肯斯特的解决方案)。由于在我找到解决方案之前发布的解决方案都不起作用,因此我没有接受任何答案。