3

我正在将一些服务从 Apache SOAP 转换为 Axis2,因此 Java 服务类已经存在。我在 Eclipse 中创建了一个新项目,导入了源代码,确保安装了 Axis2 项目方面,并且 Axis2 发射器属性正确。然后,在 Eclipse 中,我选择了服务类并选择了“Create Web Service”,选择了 Axis2 运行时。该服务已在我的 PC 上启动并运行,当我将“?wsdl”附加到服务路径时,我确实得到了一个保存在本地的 WSDL。尝试将其导入 SoapUI 以构建客户端会出现错误:

ERROR:org.apache.xmlbeans.XmlException: C:\projects\soapUI\Axis2\DALService.wsdl:0: error: src-resolve: type 'SOAPException@http://www.w3.org/2001/XMLSchema' not found.

它引用的类型 (SOAPException) 是 Apache SOAP 服务的保留,在服务代码中,我将服务代码(不是 WSDL)中的所有“导入”引用从org.apache.soap.SOAPException(旧的 Apache SOAP 包名称)更改为javax.xml.soap.SOAPException( Axis2 位置)。代码编译并工作,一旦我可以访问它,但我不能在不生成客户端的情况下访问它。关于为什么更改对象的名称空间会阻止生成的 WSDL 具有正确的名称空间引用的任何想法?

4

2 回答 2

0

让我成为第一个说我不知道​​为什么会出现这种情况的人,但我的猜测是命名空间的确切内容可能无关紧要,只要它们都相同。我们甚至没有使用 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 基类型(从这里nsim这里)的命名空间更改为之前引用的任何位置:

    <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 包或使用它的服务对象的包?
于 2010-03-18T19:22:54.893 回答
0

只需使用直接在 SOAP UI 中显示 WSDL 的“xxx?wsdl” URL,看起来 SOAP UI 工具没有找到 WSDL 中引用的一些 XSD 模式,通常这些工具也在同一文件夹中搜索模式因为你有 org.apache.soap.SOAPException 到 javax.xml.soap.SOAPException,这可能已经改变了命名空间。

只需尝试使用完整的 URL 并查看结果。

于 2010-03-17T20:06:15.887 回答