如何更新WSDL以处理响应

时间:2017-06-13 21:27:02

标签: web-services soap xsd wsdl cxf

让我们有一个简单的WSDL文件:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://www.test.com"
    xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.test.com">
    <wsdl:types>
        <xs:schema targetNamespace="http://www.test.com">
            <xs:element name="sessionId" type="xs:string">
            </xs:element>
            <xs:element name="transactionId" type="xs:string">
            </xs:element>
            <xs:element name="Login">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="userId" type="xs:string">
                        </xs:element>
                        <xs:element name="pwd" type="xs:string">
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="LoginResponse">
                <xs:complexType />
            </xs:element>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="Login">
        <wsdl:part name="parameters" element="Login"/>
    </wsdl:message>
    <wsdl:message name="LoginResponse">
        <wsdl:part name="parameters" element="LoginResponse"/>
    </wsdl:message>
    <wsdl:message name="HeaderSessionId">
        <wsdl:part name="header" element="sessionId"/>
    </wsdl:message>
    <wsdl:message name="HeaderTransactionId">
        <wsdl:part name="header" element="transactionId"/>
    </wsdl:message>
    <wsdl:portType name="MMCServicesPort"> 
        <wsdl:operation name="Login"> 
            <wsdl:input message="Login"/>  
            <wsdl:output message="LoginResponse"/>  
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="MMCServicesBinding" type="MMCServicesPort">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>  
        <wsdl:operation name="Login">
            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:header message="HeaderSessionId" part="header" use="literal"/>
                <soap:body use="literal" />
            </wsdl:output> 
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="MMCServicesService">
        <wsdl:port name="MMCServicesService" binding="MMCServicesBinding">
            <soap:address location="/test"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

对于此WSDL,以下消息是有效的响应:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
       xmlns:test="http://www.test.com">
   <soapenv:Header>
      <test:sessionId>xxx</test:sessionId>
   </soapenv:Header>
   <soapenv:Body>
      <test:LoginResponse/>
   </soapenv:Body>
</soapenv:Envelope>

什么/如何更改WSDL以接受以下消息作为登录操作响应消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header>
        <sessionId xmlns="http://www.test.com">xxx</sessionId>
    </soapenv:Header>
    <soapenv:Body>
        <LoginResponse/>
    </soapenv:Body>
</soapenv:Envelope>

... LoginResponse没有命名空间定义。

我有一个带有未知WSDL的WS,它没有提供WSDL。上面的那个已经被历史上的其他人以某种方式重建。但是,我需要使用的真正的WS提供了第二个响应,然而Apache CXF java库拒绝了它。

谢谢。

1 个答案:

答案 0 :(得分:0)

核心问题似乎与targetNamespace

的定义有关 你的代码中的

<xs:schema targetNamespace="http://www.test.com"> 当替换为: <xs:schema targetNamespace="">

SOAP XML应该没有任何前缀。

可能还需要在wsdl:binding和wsdl:service级别定义空命名空间或默认命名空间:

<wsdl:binding name="MMCServicesBinding" type="MMCServicesPort" xmlns=""> ... <wsdl:service name="MMCServicesService" xmlns="">

您可能已经基于该WSDL构建了一些代码存根,那么您还必须更新此生成的代码。