WSDL со стилем soap-rpc не компилируется - PullRequest
0 голосов
/ 05 июля 2011

Я использую этот wsdl-файл для описания моего веб-сервиса:

<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions targetNamespace="http://www.myapproach.de/knowledgebase" name="Knowledgebase"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:tns="http://www.myapproach.de/knowledgebase"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
    xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:rq="http://www.myapproach.de/knowledgebase">

    <wsdl:types>
    <xsd:schema>
      <xsd:import namespace="http://www.myapproach.de/knowledgebase" schemaLocation="GetValueRequest.xsd"/>
    </xsd:schema>
    </wsdl:types>

    <wsdl:message name="getValueForKey">
        <wsdl:part name="parameters" element="rq:getValueForKey" />
    </wsdl:message>
    <wsdl:message name="getValueForKeyResponse">
        <wsdl:part name="parameters" element="rq:getValueForKeyResponse" />
    </wsdl:message>

    <wsdl:portType name="KnowledgebasePortType">
        <wsdl:operation name="getValueForKey">
            <wsdl:input message="tns:getValueForKey" />
            <wsdl:output message="tns:getValueForKeyResponse" />
        </wsdl:operation>
    </wsdl:portType>

    <wsp:Policy wsu:Id="KnowledgebasePortBinding_WSAM_Addressing_Policy">
        <wsam:Addressing wsp:Optional="true">
            <wsp:Policy />
        </wsam:Addressing>
    </wsp:Policy>

    <wsdl:binding name="KnowledgebasePortBinding" type="tns:KnowledgebasePortType">
        <wsaw:UsingAddressing />
        <wsp:PolicyReference URI="#KnowledgebasePortBinding_WSAM_Addressing_Policy" />
        <!-- http://www.w3.org/2003/05/soap/bindings/HTTP/ -->
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" />
        <wsdl:operation name="getValueForKey">
            <soap:operation soapAction="http://www.myapproach.de/knowledgebase/getValueForKey" />
            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="Knowledgebase">
        <wsdl:port name="KnowledgebasePortType" binding="tns:KnowledgebasePortBinding">
            <soap:address location="http://www.myapproach.de/knowledgebase" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

GetValueRequest.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.myapproach.de/knowledgebase"  xmlns:tns="http://www.myapproach.de/knowledgebase">

    <xsd:element name="getValueForKey" type="tns:getValueForKey" />
    <xsd:complexType name="getValueForKey">
        <xsd:sequence>
            <xsd:element name="arg0" type="xsd:string" minOccurs="0" />
            <xsd:element name="arg1" type="xsd:string" minOccurs="0" />
            <xsd:element name="arg2" type="xsd:double"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="getValueForKeyResponse" type="tns:getValueForKeyResponse" />
    <xsd:complexType name="getValueForKeyResponse">
        <xsd:sequence>
            <xsd:element name="return" type="xsd:string" minOccurs="0" />
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>

Каждый раз, когда я запускаю wsimport, я получаю эту ошибку:

[wsimport] parsing WSDL...
[wsimport] [ERROR] Invalid wsdl:operation "getValueForKey": its a rpc-literal operation,  message part must refer to a schema type declaration
[wsimport]   line 27 of file:/path/MyFile.wsdl

Я экспортировал тип getValueForKey в xsd-schemafile, поэтому я не понимаю эту ошибку ... Я пытаюсь это sh *** весь день grml

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Вскоре после публикации вопроса я нашел ответ: -)

Вместо

<wsdl:message name="getValueForKey">
        <wsdl:part name="parameters" element="rq:getValueForKey" />
</wsdl:message>

используйте это

<wsdl:message name="getValueForKey">
        <wsdl:part name="parameters" type="rq:getValueForKey" />
</wsdl:message>

атрибут «тип» должен бытьиспользуется вместо «element».

Кроме того, элемент soap: body должен иметь пространство имен

<wsdl:input>
        <soap:body use="literal" namespace="YourNormalNamespace" />
</wsdl:input>
0 голосов
/ 10 декабря 2014

Короче говоря, часть wsdl должна иметь тип в случае RPC-стиля веб-сервисов, иначе это должен быть стиль документа.

...