ADBException:意外的子元素

时间:2013-05-15 12:58:41

标签: web-services exception axis2

我使用以下方法创建了一个Web服务:

  • Apache Axis 2 CodeGen Wizard v.1.6.2(绑定:ADB)
  • Eclipse Juno
  • Tomcat 7
  • Java 6

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

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message

从我的研究结果来看,重复过来......我认为这是一个非常普遍的问题,但尚未就如何纠正它做出决定性的答案。

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

现在我的问题是:

  1. 还是一个bug吗?
  2. 在WSDL或客户端存根中究竟需要更改什么?
  3. 值得一提的是,我创建了一个类似的Web服务,它将“String”返回给客户端。它工作正常!因此,当涉及复杂数据类型时,它会失败。

    “{strong>已知限制”标题下的Apache's website有一些信息......

    它的内容如下:“ ADB意味着是一个'简单'的数据绑定框架,并不是为了编译所有类型的模式。以下限制是最突出的

    1. 复杂类型扩展和限制。“
    2. 这是问题吗?

      以下是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>
      

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

8 个答案:

答案 0 :(得分:11)

“意外的子元素”表示接收者收到的消息包含接收者不期望的XML元素。 “{schemaTargetNs} message”是它遇到的意外元素的名称。换句话说,发件人向接收者发送了无效消息。

  • 发件人可能已经包含了一个不应该使用的元素。
  • 发件人可能遗漏了必填元素。
  • 发件人可能会按错误的顺序放置元素。
  • 发件人可能发送了完全不正确的消息。

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

答案 1 :(得分:7)

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

答案 2 :(得分:1)

查看.xsd文件。按照<xs:extension base=...>下方的字母顺序对xs元素进行排序。这符合您的需求。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

当我检查轴代码时,我发现了以下内容

if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )

这是错误发生的地方, 。 equName()方法的QName检查localPart&amp;的namespaceURI 。但是reader.getName()没有设置名称空间URI,因此发生错误

我从

更改了所有if-check
if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )

if( new javax.xml.namespace.QName("someElementName").equals(reader.getName()) )

它对我来说很好用

答案 5 :(得分:0)

此错误可能会产生误导。在我修改了WSDL并添加了一个新的强制元素之后,我创建了我的客户端。比这个错误出现了。解决方案是,我忘了在我的Web服务的一个方法中填充此元素。如果出现此错误,还要检查服务器中是否填写了必需元素。

答案 6 :(得分:0)

在我的例子中,Web服务以不同于xsd上的序列的顺序发送元素。我现在正在修改存根,所以顺序无关紧要,因为我没有机会改变Web服务。

答案 7 :(得分:0)

我有同样的问题。当base64binary克服了16k的限制时,解析器开始给出错误,基本上它在16k之后停止读取内容,因此显然文档的其余部分似乎已损坏。

我的问题是我正在使用com.sun.xml.stream.XMLReaderImpl。

移除

<dependency>
<groupId>com.sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
</dependency>

并添加

<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>wstx-asl</artifactId>
</dependency>

解决了我的问题(因此之前建议的wstx起作用了)