当XSD元素没有定义类型(类型为ur-type)时,Axis2会失败,但是在SOAP响应中返回子类型?

时间:2015-11-04 12:14:37

标签: java soap xsd wsdl axis2

我正面临使用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拒绝这个?

1 个答案:

答案 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指定。