来自XSD的手工WSDL在CXF中失败:“QueryResponse”元素上的命名空间不是有效的SOAP版本

时间:2011-08-09 18:40:26

标签: soap xsd wsdl cxf

我有一个Web服务,它遵循SOAP服务的一些语义,但它们不为所述服务提供WSDL。相反,它们提供了一个XSD,通过它我可以对WSDL进行逆向工程。事情似乎进展顺利,甚至能够

  1. 创建WSDL
  2. 使用xsd:import标记
  3. 将XSD导入为WSDL的一部分
  4. 使用CXF创建Java包装器
  5. 致电该服务。
  6. 现在,我在调用服务时得到的是一个例外:

    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文件生成中我可能做错了什么?

    编辑1

    我已经从供应商服务手动测试了该服务,对我来说响应似乎没问题:

    <?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

1 个答案:

答案 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>

基本上你不需要包含,只需要导入。您还想指定完全限定的元素表单。

希望这有效。