Web services ADBEException:意外的子元素
我使用以下方法创建了一个web服务: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 根据我的研究,
- Apache Axis 2 CodeGen向导v.1.6.2(绑定:ADB)
- 日食朱诺
- 雄猫7
- 爪哇6
org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message
根据我的研究,一次又一次。。。我认为这是一个非常普遍的问题,但还没有一个结论性的答案来纠正它
此论坛和其他论坛上的一些帖子指出,WSDL需要修改(一些名称空间),或者客户端存根需要修改。一些人甚至说亚洲开发银行有一个漏洞。在Axis的早期版本中,这肯定是一个bug,但邮件档案中有许多帖子指出该bug已经修复。这些邮件归档与Axis2的早期版本相关
现在我的问题是:
<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>