Xml 导入名称空间的Eclipse WSDL验证错误
我从组织中的一个服务团队收到了一个非内联WSDL文件,在Eclipse中将他们的所有XSD添加到XML目录后,我发现他们的主WSDL文件没有验证。它似乎找不到Xml 导入名称空间的Eclipse WSDL验证错误,xml,eclipse,web-services,xsd,wsdl,Xml,Eclipse,Web Services,Xsd,Wsdl,我从组织中的一个服务团队收到了一个非内联WSDL文件,在Eclipse中将他们的所有XSD添加到XML目录后,我发现他们的主WSDL文件没有验证。它似乎找不到中定义的元素。验证错误如下所示: fault元素正在引用未定义的消息“serviceFault”。检查消息名称和命名空间是否正确,以及消息是否已定义 在同一文件夹中,所有文件路径都是相对的。下面是一个重新创建验证错误的小测试示例: test.xsd <?xml version="1.0" encoding="UTF-8"?> &
中定义的
元素。验证错误如下所示:
fault元素正在引用未定义的消息“serviceFault”。检查消息名称和命名空间是否正确,以及消息是否已定义
在同一文件夹中,所有文件路径都是相对的。下面是一个重新创建验证错误的小测试示例:
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>
<?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.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>
<?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>
如果在Eclipse中将test.xsd添加到XML目录中,则会显示验证错误。他们坚持认为他们的wsdl或模式没有问题,JAX-WS似乎可以通过wsimport生成代理。此外,在与端点通信时,它似乎可以很好地封送和取消封送请求和响应
这可能是Eclipse的WSDL验证中的错误吗
编辑:只是一个想法,尽管我还没有解决这个问题。我认为可能发生的事情是Eclipse正在验证命名空间以
test.xsd
,但在该命名空间中还有common.wsdl
,它声明了自己的元素。当Eclipse在ns名称空间中查找这个公共的ns:serviceFault
时,它显然不会在test.xsd
中找到它。这让我觉得EclipseWSDL验证在这里应该更智能一些,可以识别WSDL导入并包括其中的所有内容,以及在其XML目录中声明的模式。如果我在这里是正确的,我仍然不知道如何解决它。Eclipse是否有一个功能可以真正正确地验证这种类型的WSDL情况?我自己创建了文件,并使用Eclipse Luna 4.4.0和Web Developer Tools 3.2.5
进行了测试。我将两个.wsdl
文件放在同一个通用项目中,然后通过向导将.xsd
导入XML目录中
当我验证每个文件时,Eclipse没有发现任何错误/警告。只有当我从项目中删除了common.wsdl
文件时,我才收到您引用的错误消息,但这是意料之中的,因为它是在test.wsdl
中导入的。我还尝试在SOAPUI5.0.0
中使用test.wsdl(来自Eclipse目录)创建一个新的SoapUI项目,它也没有抱怨
由于我无法重现这个错误,我认为它很可能是您正在使用的特定Eclipse版本的错误,或者是Web开发人员工具的错误。或者可能是一些当地的胡说八道,一眼就看不出来。再次确保Eclipse实际上将所有文件物理地放在文件系统的同一目录中
如果您决定更改版本,请参阅我的Eclipse配置清单,以便进行比较
我很高兴能够进一步帮助您,但至少我向您确认了该问题是本地问题。祝你好运
在评论1后更新1 最初,我通过Import->XML->XML目录导入了
test.xsd
。现在,我将.xsd
移动到另一个文件系统位置,并将其从项目中删除(因为否则它总是有效的)。然后,我按照您的建议做了(窗口->首选项->XML->XML目录->用户指定的条目->目录条目->从文件系统:键类型=尝试了命名空间名称和架构位置和键http://www.example.org/test
)。执行此操作后,我在读取.xsd文件(指向项目的本地目录而不是新位置)时收到警告错误和多个错误,其中一个是您的错误
如果我删除common.wsdl
中的schemaLocation=“test.xsd”
属性,并且keytype
设置为Namespace
,那么common.wsdl
工作并且没有错误,但是test.wsdl
说明:
fault元素正在引用未定义的消息“serviceFault”。检查消息名称和命名空间是否正确,以及消息是否已定义
我看到common.wsdl有两个名称空间具有相同的名称空间:xs
和xsd
(“”)。这可能是导致错误的原因吗
更新2
我进一步研究发现,解释如何使用XML目录和模式。根据它的说法,这种行为在某种程度上是意料之中的:
注意:如果您的XML文档指定了相对模式位置(例如下面显示的“foo.xsd”),则不能使用“foo.xsd”作为模式位置键注册XML模式。TODO:下面的参考部分描述了为什么会出现这种情况,以及XMLCatalogV1.1如何提供部分解决此问题的方法<代码>感谢您对此进行调查。您是否记得添加test.xsd
fi