让我成为第一个说我不知道为什么会出现这种情况的人,但我的猜测是命名空间的确切内容可能无关紧要,只要它们都相同。我们甚至没有使用 SOAPException 的任何特殊功能,因为它只是盲目地扩展了常规 Exception。无论如何,通过做三件事,我能够让 SoapUI 从 XML 构建客户端。
首先,我添加了一个部分来表示 SOAPException 本身,如下所示:
<xs:schema xmlns:test="http://service.PROJECT.DEPARTMENT.COMPANY.com" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://DEPARTMENT.COMPANY.com/xsd">
<xs:import namespace="http://service.PROJECT.DEPARTMENT.COMPANY.com"/>
<xs:complexType name="SOAPException">
<xs:complexContent>
<xs:extension base="ns:Exception">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
其次,我将以下命名空间添加到 wsdl:definitions 块中:
xmlns:im="http://DEPARTMENT.COMPANY.com/xsd"
第三,我将引用到 SOAPException 基类型(从这里ns
到im
这里)的命名空间更改为之前引用的任何位置:
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.ims.im.sa.homedepot.com/xsd">
<xs:complexType name="SOAPLocatorException">
<xs:complexContent>
<xs:extension base="im:SOAPException">
<xs:sequence>
<xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="messageCode" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
XML 文件仍然没有在 XMLSpy 中完全验证,但只是因为一个不直接影响我的更深奥的原因(操作,为 Soap11 和 Soap12 绑定定义了错误,没有为原始 HTTP 绑定)。
即使它有效,我仍然对以下内容有些困惑:
- 如果 Axis2 知道 SOAPException 类型(它确实知道,因为它提到它是其他异常的基类),为什么不在一个
xs:schema
块中定义它?
- 沿着同样的思路,为什么在将其用作另一种类型的基类时,它会从不正确的命名空间中引用该类?
- 为什么我必须将此类型的命名空间设置为
DEPARTMENT.COMPANY.com
Axis2 包或使用它的服务对象的包?