SoapUI或WSDL2Java无法读取Axis2服务生成的WSDL

时间:2010-03-17 19:03:12

标签: java web-services axis2 soapui wsdl2java

我正在将一些服务从Apache SOAP转换为Axis2,因此Java服务类已经存在。我在Eclipse中创建了一个新项目,导入了源代码,确保安装了Axis2项目构面,并且Axis2发射器属性是正确的。然后,在Eclipse中,我选择了服务类并选择了“创建Web服务”,选择了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服务的保留,在服务代码中,我更改了org.apache.soap.SOAPException中服务代码(而不是WSDL)中的所有“import”引用(旧的Apache SOAP包名称)到javax.xml.soap.SOAPException(Axis2位置)。一旦我可以访问它,代码就可以编译和工作,但是如果不生成客户端,我就无法访问它。关于为什么更改对象的命名空间会使生成的WSDL没有正确的命名空间引用?

2 个答案:

答案 0 :(得分:0)

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

只需尝试使用完整的网址即可查看结果。

答案 1 :(得分: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基本类型(从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包或 使用它的服务对象的包?