【问题标题】:WSDLs generated by Axis2 services can't be read by SoapUI or WSDL2JavaSoapUI 或 WSDL2Java 无法读取 Axis2 服务生成的 WSDL
【发布时间】:2011-01-28 17:38:41
【问题描述】:

我正在将一些服务从 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 具有正确的命名空间引用的任何想法?

【问题讨论】:

    标签: java web-services axis2 soapui wsdl2java


    【解决方案1】:

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

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

    【讨论】:

    • 将 URL 传递给 WSDL 而不是本地副本会产生相同的错误。我不确定您的其他建议是什么,但如果 Axis 可以正确命名我的自定义对象以及 Apache SOAP 对象和 Axis2 对象,为什么要将路径从一个有效条目更改为另一项?
    • 问题在于命名空间,检查 SOAPException 的命名空间,在你的两个 WSDL 中它们会有所不同,在大多数基于 Java 的 Web 服务引擎中元素命名空间都是从对象类型派生的。跨度>
    【解决方案2】:

    让我成为第一个说我不知道​​为什么会出现这种情况的人,但我的猜测是命名空间的确切内容可能并不重要,只要它们都相同。我们甚至没有使用 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 包或 使用它的服务对象的包?

    【讨论】:

    • 更改命名空间前缀(从 ns 到 im 这里),无济于事,但设置命名空间 DEPARTMENT.COMPANY.com 是有道理的,问题是您的 SOAPException 是在“DEPARTMENT.COMPANY.com”下创建的自定义元素。 COMPANY.com" 命名空间和 SOAPException 的 Axis 2 命名空间是不同的,因此它就像两个具有相同 bame 但类型不同的元素。 (例如来自 Apple 和 MS 两家供应商)
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多