【问题标题】:ADBException: Unexpected subelementADBException:意外的子元素
【发布时间】:2013-05-10 01:26:48
【问题描述】:

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

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

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

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

根据我的研究,一遍遍……我认为这是一个非常普遍的问题,但对于应该采取什么措施来纠正它,还没有一个确凿的答案。

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

现在我的问题是:

  1. 这还是一个错误吗?
  2. WSDL 或客户端存根中究竟需要更改哪些内容?

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

有一些关于Apache's website 的信息,在“已知限制”标题下...

上面写着:“ADB 旨在成为一个‘简单’的数据绑定框架,并不意味着编译所有类型的模式。以下限制最为突出

  1. 复杂类型扩展和限制。”

这是问题吗?

以下是您可能感兴趣的 WSDL 文件中的 sn-p...

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

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

【问题讨论】:

    标签: web-services exception axis2


    【解决方案1】:

    我遇到了同样的问题。当 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 有效)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          查看您的 .xsd 文件。在&lt;xs:extension base=...&gt; 下方按字母顺序对 xs 元素进行排序。这将满足您的需求。

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

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

              这是发生错误的地方, . QName 的 equals() 方法检查 localPart 和 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()) )
              

              对我来说效果很好

              【讨论】:

                【解决方案7】:

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

                【讨论】:

                  【解决方案8】:

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

                  • 发件人可能包含了不应该包含的元素。
                  • 发件人可能遗漏了一个强制元素。
                  • 发件人可能以错误的顺序放置元素。
                  • 发件人可能发送了完全错误的消息。

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

                  【讨论】:

                  • 错误肯定在服务器的响应中,但是如何找出预期的元素?除非我知道这一点,否则我将无法解决问题。我有来自服务器的响应 XML,对我来说似乎很好。
                  • 好吧,如果您要在调试器中运行客户端,和/或如果您有 org.apache.axis2.AxisFault 的堆栈跟踪,那么您可以在引发错误的消息解析器。那时应该很明显它所期望的元素是什么。
                  • 这可能归结为客户端是基于错误的 WSDL 副本生成的。所以服务器发送的响应与客户端期望的不匹配。
                  • 是的,我可以看到它的预期,但不知道它的预期是否正确,即代码是否正确。许多人在邮件列表上发帖说这实际上是 Axis 的一个问题,这可能会让您感到困惑。结果就是这样……
                  • CodeGen(来自 WSDL)为我正在使用的 Java 对象(bean)生成的代码,期望 bean 中的字段有不同的命名空间。我修复了它并且工作正常。仍然对 Axis CodeGen 如何生成不正确的 wsdl / 代码感到困惑?
                  猜你喜欢
                  • 2011-04-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-06-08
                  相关资源
                  最近更新 更多