Web services ADBEException:意外的子元素

Web services ADBEException:意外的子元素,web-services,exception,axis2,Web Services,Exception,Axis2,我使用以下方法创建了一个web服务: Apache Axis 2 CodeGen向导v.1.6.2(绑定:ADB) 日食朱诺 雄猫7 爪哇6 该服务将一个自定义Java对象(DataBean)返回给客户端,但我在客户端代码中偶然发现了一个异常: org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message 根据我的研究,

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

  • Apache Axis 2 CodeGen向导v.1.6.2(绑定:ADB)
  • 日食朱诺
  • 雄猫7
  • 爪哇6
该服务将一个自定义Java对象(DataBean)返回给客户端,但我在客户端代码中偶然发现了一个异常:

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message
根据我的研究,一次又一次。。。我认为这是一个非常普遍的问题,但还没有一个结论性的答案来纠正它

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

现在我的问题是:

  • 它还是一只虫子吗
  • WSDL或客户端存根中到底需要更改什么
  • 值得一提的是,我创建了一个类似的web服务,它向客户端返回一个“字符串”。很好用!因此,当涉及复杂的数据类型时,它会失败

    在“已知限制”标题下,有一些关于

    它是这样写的:“ADB是一个“简单”的数据绑定框架,并不是用来编译所有类型的模式

  • 复杂类型扩展和限制
  • 这就是问题所在吗

    以下是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>
    
    
    
    现在我如何解决这个问题?我应该在这里包含一些其他代码片段吗

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

    • 发送者可能包含了一个它不应该包含的元素
    • 发件人可能遗漏了一个必填元素
    • 发送方可能将元素按错误的顺序放置
    • 发件人可能发送了完全不正确的消息

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

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

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

    if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )
    
    这就是错误发生的地方, . QName检查localPart和namespaceURI的equals()方法 . 但是reader.getName()没有设置名称空间URI,因此发生了错误

    我把所有的if支票都从

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


    这对我来说很好

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

    查看.xsd文件。在
    下面按字母顺序对xs元素进行排序。这将满足您的需要。

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

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

    我也遇到了同样的问题。当base64binary超过16k限制时,解析器开始给出错误,实际上它在16k之后停止读取内容,因此文档的其余部分显然已损坏

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

    移除

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

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

    解决了我的问题(因此之前建议的wstx正在工作)

    错误肯定在服务器的响应中,但是如何找出预期的元素?除非我知道这一点,否则我无法解决问题。我有来自服务器的响应XML,对我来说似乎很好。好吧,如果您要在调试器中运行客户端,和/或如果您有org.apache.axis2.AxisFault的stacktrace,那么您可以在抛出错误的消息解析器中找到特定的代码行。在这一点上,它所期望的元素应该是显而易见的,这可能归结为这样一个事实:客户机是基于不正确的WSDL副本生成的。因此,服务器发送的响应与客户端的预期不匹配。是的,我可以看到它的预期,但不知道它是否预期
    <dependency>
    <groupId>org.codehaus.woodstox</groupId>
    <artifactId>wstx-asl</artifactId>
    </dependency>