我正面临使用Axis2的SOAP Web服务客户端的问题;扩展WSDL的XSD文件为响应中的元素保留以下定义,注意无类型的定义方式:
<xs:element name="error" minOccurs="0"/>
以下是SOAP服务返回的实际响应:
<error>
<details>Unexpected Error Occurred</details>
</error>
这导致Axis2抛出以下异常:
org.apache.axis2.AxisFault: javax.xml.stream.XMLStreamException: element text content may not contain START_ELEMENT
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
at fr.cel.service.HooStub.fromOM(HooStub.java:847
服务人员说,由于'error'元素没有定义类型,因此它可以包含所有内容,例如字符串,日期或其他结构。
我真的不相信;那么,没有为元素定义类型是什么意思?
此外,我们可以对WSDL或Axi2 wsdl2java存根生成命令进行任何更改,以便我们避免这种情况吗?知道响应而不是<details>
我们实际上可能会收到其他一些子类型。
更新:我使用的是Axis2 1.5.4,看来W3C XSD规格说我们在这种情况下可以有子类型(当使用ur-type时,即没有定义类型),为什么Axis2拒绝这个?
答案 0 :(得分:0)
您的服务人员是正确的。
根据W3C XSD建议书,3.3.2 XML Representation of Element Declaration Schema Components:
{type definition}对应的类型定义 或中的元素信息项 [children],如果存在,则为类型定义 ·解析·由[属性]类型的实际值,否则 元素声明的{type definition}·由...解决 ·substitutionGroup [attribute]的实际值,如果存在, 否则为·ur-type definition·。
在ur-type的链接之后,将产生指定的任何类型默认为anyType。
通过提供需要error
元素的类型,您当然可以收紧detail
的定义。如果只考虑XSD的限制,这是否可以避免您的异常还不清楚,您应该能够在details
中放置error
元素。您的应用程序软件(Axis2)可能会施加额外的要求,而这些要求并非完全由XSD指定。