导入的命名空间的Eclipse WSDL验证错误

时间:2015-04-17 12:57:14

标签: xml eclipse web-services xsd wsdl

我从组织中的服务团队收到了一个非内联WSDL文件,在将所有XSD添加到Eclipse中的XML目录后,我发现他们的主要WSDL文件没有验证。它似乎找不到<wsdl:message>中定义的<wsdl:import>元素。验证错误是这样的:

  

fault元素引用了未定义的消息&#39; serviceFault&#39;。检查消息名称和命名空间是否正确以及消息是否已定义。

所有文件路径都是相同的文件夹。这是一个重新生成验证错误的小测试示例:

test.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema 
    targetNamespace="http://www.example.org/test" xmlns="http://www.example.org/test"
    elementFormDefault="qualified" attributeFormDefault="unqualified"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:ibmSchExtn="http://www.ibm.com/schema/extensions">

    <xsd:complexType name="ServiceFaultType">
        <xsd:sequence>
            <xsd:element name="code" type="xsd:string" />
            <xsd:element name="message" type="xsd:string" />
            <xsd:element minOccurs="0" name="detail" type="xsd:string" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element ibmSchExtn:docRoot="true" name="serviceFault"
        type="ServiceFaultType" />
</xsd:schema>

common.wsdl

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="http://www.example.org/test" xmlns="http://www.example.org/test"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:documentation>
        <wsdl:appinfo source="WMQI_APPINFO">
            <MRWSDLAppInfo xmlns="urn:xxx.xxx.xxxbank.com/common/service"
                imported="true" />
        </wsdl:appinfo>
    </wsdl:documentation>
    <wsdl:types>
        <xs:schema elementFormDefault="qualified">
            <xs:import namespace="http://www.example.org/test"
                schemaLocation="test.xsd" />
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="serviceFault">
        <wsdl:part element="serviceFault" name="fault" />
    </wsdl:message>
</wsdl:definitions>

test.wsdl

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="urn:testservice" xmlns="urn:testservice"
    xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
    xmlns:ns="http://www.example.org/test"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">


    <wsdl:import namespace="http://www.example.org/test" location="common.wsdl"></wsdl:import>
    <wsdl:types>
        <xsd:schema targetNamespace="urn:testservice">
            <xsd:element name="NewOperation">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="in" type="xsd:string" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="NewOperationResponse">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="out" type="xsd:string" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="NewOperationRequest">
        <wsdl:part element="NewOperation" name="parameters" />
    </wsdl:message>
    <wsdl:message name="NewOperationResponse">
        <wsdl:part element="NewOperationResponse" name="parameters" />
    </wsdl:message>
    <wsdl:portType name="test">
        <wsdl:operation name="NewOperation">
            <wsdl:input message="NewOperationRequest" />
            <wsdl:output message="NewOperationResponse" />
            <wsdl:fault message="ns:serviceFault" name="fault" />
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="testSOAP" type="test">
        <soap:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="NewOperation">
            <soap:operation soapAction="http://www.example.org/test/NewOperation" />
            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="test">
        <wsdl:port binding="testSOAP" name="testSOAP">
            <soap:address location="http://www.example.org/" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

如果将test.xsd添加到Eclipse中的XML目录,则会演示验证错误。他们坚持认为他们的WSDL或模式没有任何问题,JAX-WS似乎可以使用wsimport生成代理。此外,在与终端交谈时,似乎可以对请求和响应进行编组和解组。

这可能是Eclipse的WSDL验证中的错误吗?

编辑:即使我还没有解决问题,我只是想一想。我认为可能会发生的事情是Eclipse正在将命名空间验证为test.xsd,而且该命名空间中的common.wsdl也声明了它自己的元素。当Eclipse在ns命名空间中查找此公共ns:serviceFault时,它显然无法在test.xsd中找到它。这让我觉得Eclipse WSDL验证在这里应该更加智能,并确定WSDL导入并包含其中的所有内容以及在其XML目录中声明的模式。如果我在这里,我仍然不知道如何解决它。是否有一个Eclipse的功能可以正确地验证这种类型的WSDL情况?

1 个答案:

答案 0 :(得分:1)

我在我身边创建了文件,并使用Eclipse Luna 4.4.0Web Developer Tools 3.2.5进行了测试。我将两个.wsdl文件放在同一个通用项目中,然后通过向导在XML目录中导入.xsd

当我验证每个文件时,Eclipse没有发现任何错误/警告。我确实只是在我从项目中删除common.wsdl文件时才收到错误消息,但这是因为它是在test.wsdl中导入的。我还尝试在SoapUI 5.0.0中使用test.wsdl(来自Eclipse目录)创建一个新的SoapUI项目,它也没有抱怨。

由于我无法重现错误,我认为它很可能是您正在使用的特定Eclipse版本的错误或Web Developer Tools的错误。或者它可能是一些当地的废话,只是一眼就看不到。再次确保Eclipse实际上将所有文件物理地放在文件系统的同一目录中。

如果您决定更改版本,请参阅我的Eclipse配置的screenshot以供您比较。 screenshot

我很高兴能够进一步帮助你,但至少我告诉你这个问题是本地的。祝你好运!


评论1后更新1

最初,我通过导入 - &gt; XML-&gt; XML目录导入了test.xsd。现在我将.xsd移动到另一个文件系统位置并将其从项目中删除(因为否则它始终有效)。然后,我按你提议的那样做了(Window-&gt; Preferences-&gt; XML-&gt; XML目录 - &gt;用户指定的条目 - &gt;目录条目 - &gt;来自文件系统密钥类型 =尝试命名空间名称架构位置密钥 = http://www.example.org/test)。执行此操作后,我收到警告Error reading .xsd file (pointing to the local directory of the project instead of the new location)和多个错误,其中一个是您的错误。

如果我删除了schemaLocation="test.xsd"中的common.wsdl属性,并且keytype设置为Namespace,则common.wsdl有效并且没有错误,但{ {1}}说:

fault元素引用了未定义的消息'serviceFault'。检查消息名称和命名空间是否正确以及消息是否已定义。

我看到common.wsdl有两个具有相同命名空间名称的命名空间:test.wsdlxs(“http://www.w3.org/2001/XMLSchema”)。这会导致错误吗?

更新2

我进一步调查,发现this wiki page,解释了使用XML目录和模式。根据它,行为有点预期:

  

注意:如果您的XML文档指定了相对模式位置(例如,如下所示'foo.xsd'),则无法使用“foo.xsd”作为模式位置键来注册XML模式。 TODO:下面的参考部分描述了为什么会出现这种情况,以及XML Catalog v1.1如何提供部分解决此问题的方法。 xsd

所以他们似乎知道这些相对路径存在问题。

然后我尝试在目录密钥和schemaLocation中使用完整的URI,它没有错误:

http://i.imgur.com/wEXiMrm.jpg

我将继续研究这个问题(我在Eclipse论坛上找到了this thread,其中讨论了类似的话题)如果弹出某些内容我会发布更新。