我有一个Web服务,它遵循SOAP服务的一些语义,但它们不为所述服务提供WSDL。相反,它们提供了一个XSD,通过它我可以对WSDL进行逆向工程。事情似乎进展顺利,甚至能够
xsd:import
标记现在,我在调用服务时得到的是一个例外:
INFO: Creating Service {http://service.something.net/xml}QueryService from WSDL: file:/C:/mydocs/Work/project/my-service.wsdl
Aug 09, 2011 1:22:34 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
WARNING: Interceptor for {http://service.something.net/xml}QueryService#{http://servicesomething..../xml}QueryRequest has thrown exception, unwinding now
org.apache.cxf.binding.soap.SoapFault: "http://service.something.net/xml", the namespace on the "QueryResponse" element, is not a valid SOAP version.
可以找到WSDL in this gist,而XSD是我从供应商处获得的。
错误是什么意思?在.wsdl
文件生成中我可能做错了什么?
我已经从供应商服务手动测试了该服务,对我来说响应似乎没问题:
<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<QueryResponse xmlns="http://service.something.net/xml">
....
</QueryResponse>
</Body>
</Envelope>
除非我遗漏了什么,否则CXF甚至不希望QueryResponse
成为SOAP元素,因为它的命名空间不是SOAP而是http://service.something.net/xml
。
答案 0 :(得分:1)
您要导入XSD的地方:
<wsdl:types>
<xsd:schema targetNamespace="http://service.something.net/xml">
<xsd:include schemaLocation="My-XSD.xsd" />
</xsd:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://service.something.net/xml"
schemaLocation="My-XSD.xsd">
</xsd:import>
</xsd:schema>
</wsdl:types>
试试这个:
<wsdl:types>
<xs:schema targetNamespace="http://service.something.net/xml"
elementFormDefault="qualified">
<xs:import schemaLocation="My-XSD.xsd"/>
</xs:schema>
</wsdl:types>
基本上你不需要包含,只需要导入。您还想指定完全限定的元素表单。
希望这有效。