WSDL Apache CXF Issue - PullRequest
       24

WSDL Apache CXF Issue

1 голос
/ 03 февраля 2012

Итак, я использую устаревший WSDL и хочу сгенерировать из него некоторый Java-код, чтобы получить лучшее представление о том, что именно делает веб-сервис, так как я считаю, что Java-код легче читать, чем WSDL.Однако использование подключаемого модуля генератора исходного кода Apache CFX с использованием приведенного ниже файла WSDL выдает мне следующую ошибку (та же, что и в soapUI):

Обнаружен недопустимый атрибут расширения "soapAction".Атрибуты расширения должны находиться в пространстве имен, отличном от WSDL.

Итак, я хочу изменить WSDL так, чтобы он по-прежнему правильно описывал веб-сервис, но мог фактически использоваться плагином. Любые предложения будутнаиболее ценится.Я включил весь WSDL, потому что я не знал, какие части могут иметь значение, поэтому извиняюсь за огромную стену текста.

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tns="http://api.voiceforge.com/SOAPI" 
targetNamespace="http://api.voiceforge.com/SOAPI"
xmlns:impl="http://api.voiceforge.com/SOAPI"
xmlns:intf="http://api.voiceforge.com/SOAPI"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


<!-- Types -->

  <wsdl:types>
      <xsd:schema elementFormDefault="qualified" targetNamespace="http://api.voiceforge.com/SOAPI">


      <!-- Say -->

      <xsd:complexType name="ComplexTextInfo">
        <xsd:sequence>
          <xsd:element name="SynthString" type="xsd:string" />
          <xsd:element minOccurs="0" maxOccurs="1" name="Encoding" type="xsd:string" />
        </xsd:sequence>
      </xsd:complexType>

      <xsd:complexType name="ComplexVoiceInfo">
        <xsd:all>
          <xsd:element name="Owner" type="xsd:string" />
          <xsd:element name="Name" type="xsd:string" />
        </xsd:all>
      </xsd:complexType>

      <xsd:complexType name="ComplexAudioInfo">
        <xsd:all>
          <xsd:element name="DeliveryType" type="xsd:string" />
          <xsd:element name="Format" type="xsd:string" />
          <xsd:element name="SignalRate" type="xsd:string" />
        </xsd:all>
      </xsd:complexType>

      <xsd:complexType name="ComplexAudioData">
        <xsd:all>
          <xsd:element name="DeliveryType" type="xsd:string" />
          <xsd:element name="Format" type="xsd:string" />
          <xsd:element name="Data" type="xsd:string" />
        </xsd:all>
      </xsd:complexType>


      <!-- CreateAccount -->

      <xsd:complexType name="ComplexCreateUserInfo">
        <xsd:all>
          <xsd:element name="UserID" type="xsd:string" />
          <xsd:element name="Password" type="xsd:string" />
          <xsd:element name="DOB" type="xsd:string" />
          <xsd:element name="Email" type="xsd:string" />
          <xsd:element name="ZipCode" type="xsd:string" />
          <xsd:element name="Gender" type="xsd:string" />
        </xsd:all>
      </xsd:complexType>


      <!-- Voice Search -->

      <xsd:complexType name="ComplexQuery">
        <xsd:all>
          <xsd:element name="Owner" type="xsd:string" />
          <xsd:element name="Name" type="xsd:string" />
          <xsd:element name="Age" type="xsd:string" />
          <xsd:element name="Gender" type="xsd:string" />
          <xsd:element name="Language" type="xsd:string" />
        </xsd:all>
      </xsd:complexType>

      <xsd:complexType name="ComplexQueryResult">
        <xsd:all>
          <xsd:element name="Owner" type="xsd:string" />
          <xsd:element name="Name" type="xsd:string" />
          <xsd:element name="Age" type="xsd:string" />
          <xsd:element name="Gender" type="xsd:string" />
          <xsd:element name="Language" type="xsd:string" />
          <xsd:element name="Dialect" type="xsd:string" />
        </xsd:all>
      </xsd:complexType>

      <xsd:complexType name="ComplexQueryResultArray">
        <xsd:sequence>
          <xsd:element maxOccurs="unbounded" name="Voice" nillable="true" type="tns:ComplexQueryResult"/>
        </xsd:sequence>
      </xsd:complexType>

    </xsd:schema>
  </wsdl:types>


  <!-- Messages -->

  <wsdl:message name="GetSessionIDSoapIN">
    <wsdl:part name="ApplicationID" type="xsd:string" />
    <wsdl:part name="UserID" type="xsd:string" />
  </wsdl:message>

  <wsdl:message name="GetSessionIDSoapOUT">
    <wsdl:part name="SessionID" type="xsd:string" />
    <wsdl:part name="Error" type="xsd:string" />
  </wsdl:message>

  <wsdl:message name="SaySoapIN">
    <wsdl:part name="SessionID" type="xsd:string" />
    <wsdl:part name="Text" type="tns:ComplexTextInfo" />
    <wsdl:part name="VoiceInfo" type="tns:ComplexVoiceInfo" />
    <wsdl:part name="AudioInfo" type="tns:ComplexAudioInfo" />
  </wsdl:message>

  <wsdl:message name="SaySoapOUT">
    <wsdl:part name="Audio" type="tns:ComplexAudioData" />
    <wsdl:part name="Error" type="xsd:string" />
  </wsdl:message>

  <wsdl:message name="CreateAccountSoapIN">
    <wsdl:part name="ApplicationID" type="xsd:string" />
    <wsdl:part name="UserInfo" type="tns:ComplexCreateUserInfo" />
  </wsdl:message>

  <wsdl:message name="CreateAccountSoapOUT">
    <wsdl:part name="UserID" type="xsd:string" />
    <wsdl:part name="Error" type="xsd:string" />
  </wsdl:message>

  <wsdl:message name="VoiceSearchSoapIN">
    <wsdl:part name="SessionID" type="xsd:string" />
    <wsdl:part name="Query" type="tns:ComplexQuery" />
  </wsdl:message>

  <wsdl:message name="VoiceSearchSoapOUT">
    <wsdl:part name="VoiceList" type="tns:ComplexQueryResultArray" />
    <wsdl:part name="Error" type="xsd:string" />
  </wsdl:message>

  <wsdl:message name="GetAccountInfoSoapIN">
    <wsdl:part name="ApplicationID" type="xsd:string" />
    <wsdl:part name="UserID" type="xsd:string" />
  </wsdl:message>

  <wsdl:message name="GetAccountInfoSoapOUT">
    <wsdl:part name="SynthesesRemaining" type="xsd:int" />
    <wsdl:part name="DefaultVoiceInfo" type="tns:ComplexVoiceInfo" />
    <wsdl:part name="Error" type="xsd:string" />
  </wsdl:message>

  <wsdl:message name="UpdateAccountInfoSoapIN">
    <wsdl:part name="ApplicationID" type="xsd:string" />
    <wsdl:part name="UserID" type="xsd:string" />
    <wsdl:part name="DefaultVoiceInfo" type="tns:ComplexVoiceInfo" />
    <wsdl:part name="ModifySynthesisAmount" type="xsd:int" />
  </wsdl:message>

  <wsdl:message name="UpdateAccountInfoSoapOUT">
    <wsdl:part name="SynthesesRemaining" type="xsd:int" />
    <wsdl:part name="DefaultVoiceInfo" type="tns:ComplexVoiceInfo" />
    <wsdl:part name="Error" type="xsd:string" />
  </wsdl:message>


  <!-- Port Types -->

  <wsdl:portType name="VF-HTTPS-Binding">
    <wsdl:operation name="GetSessionID">
      <wsdl:input message="tns:GetSessionIDSoapIN" />
      <wsdl:output message="tns:GetSessionIDSoapOUT" />
    </wsdl:operation>
    <wsdl:operation name="CreateAccount">
      <wsdl:input message="tns:CreateAccountSoapIN" />
      <wsdl:output message="tns:CreateAccountSoapOUT" />
    </wsdl:operation>
    <wsdl:operation name="GetAccountInfo">
      <wsdl:input message="tns:GetAccountInfoSoapIN" />
      <wsdl:output message="tns:GetAccountInfoSoapOUT" />
    </wsdl:operation>
    <wsdl:operation name="UpdateAccountInfo">
      <wsdl:input message="tns:UpdateAccountInfoSoapIN" />
      <wsdl:output message="tns:UpdateAccountInfoSoapOUT" />
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:portType name="VF-HTTP-Binding">
    <wsdl:operation name="VoiceSearch">
      <wsdl:input message="tns:VoiceSearchSoapIN" />
      <wsdl:output message="tns:VoiceSearchSoapOUT" />
    </wsdl:operation>
    <wsdl:operation name="Say">
      <wsdl:input message="tns:SaySoapIN" />
      <wsdl:output message="tns:SaySoapOUT" />
    </wsdl:operation>
  </wsdl:portType>


  <!-- Bindings -->

  <wsdl:binding name="VF-HTTPS-Binding" type="tns:VF-HTTPS-Binding">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" />
    <wsdl:operation name="GetSessionID" soapAction="http://api.voiceforge.com/SOAPI#GetSessionID">
      <soap:operation soapAction="https://api.voiceforge.com/SOAPI#GetSessionID" RequestNamespace="https://api.voiceforge.com/SOAPI" ResponseNamespace="https://api.voiceforge.com/SOAPI" style="rpc" />
      <wsdl:input>
        <soap:body use="literal" namespace="https://api.voiceforge.com/SOAPI"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" namespace="https://api.voiceforge.com/SOAPI"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="CreateAccount">
      <soap:operation soapAction="https://api.voiceforge.com/SOAPI#CreateAccount" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" style="rpc" />
      <wsdl:input>
        <soap:body use="literal" namespace="https://api.voiceforge.com/SOAPI"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" namespace="https://api.voiceforge.com/SOAPI"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetAccountInfo">
      <soap:operation soapAction="https://api.voiceforge.com/SOAPI#GetAccountInfo" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" style="rpc" />
      <wsdl:input>
        <soap:body use="literal" namespace="https://api.voiceforge.com/SOAPI"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" namespace="https://api.voiceforge.com/SOAPI"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="UpdateAccountInfo">
      <soap:operation soapAction="https://api.voiceforge.com/SOAPI#UpdateAccountInfo" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" style="rpc" />
      <wsdl:input>
        <soap:body use="literal" namespace="https://api.voiceforge.com/SOAPI"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" namespace="https://api.voiceforge.com/SOAPI"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

  <wsdl:binding name="VF-HTTP-Binding" type="tns:VF-HTTP-Binding">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" />
    <wsdl:operation name="VoiceSearch">
      <soap:operation soapAction="http://api.voiceforge.com/SOAPI#VoiceSearch" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" style="rpc" />
      <wsdl:input>
        <soap:body use="literal" namespace="http://api.voiceforge.com/SOAPI"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" namespace="http://api.voiceforge.com/SOAPI"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="Say">
      <soap:operation soapAction="http://api.voiceforge.com/SOAPI#Say" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" style="rpc" />
      <wsdl:input>
        <soap:body use="literal" namespace="http://api.voiceforge.com/SOAPI"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" namespace="http://api.voiceforge.com/SOAPI"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>


  <!-- Services -->

  <wsdl:service name="VoiceForgeAPI-S">
    <wsdl:port name="VF-HTTPS" binding="tns:VF-HTTPS-Binding">
      <wsdl:documentation>VoiceForge HTTPS Service</wsdl:documentation>
      <soap:address location="https://api.voiceforge.com/soapi.pl" />
    </wsdl:port>
  </wsdl:service>

  <wsdl:service name="VoiceForgeAPI-I">
    <wsdl:port name="VF-HTTP" binding="tns:VF-HTTP-Binding">
      <wsdl:documentation>VoiceForge HTTP Service</wsdl:documentation>
      <soap:address location="http://api.voiceforge.com/soapi.pl" />
    </wsdl:port>
  </wsdl:service>

</wsdl:definitions>

Редактирование с помощью генератора кода C #:

// -------------------------------------------------------------- wsdl2 -out: VoiceForgeAPI.cs Веб-сервисы описания языка wsdl / soapi.wsdl Описание Утилита языка Mono Framework v2.0.50727.1433

Там, где при генерации кода появляются некоторые предупреждения:

wsdl/soapi.wsdl
   - This web reference does not conform to WS-I Basic Profile v1.1
       R2209: A wsdl:binding in a DESCRIPTION SHOULD bind every wsdl:part of a
       wsdl:message in the wsdl:portType to which it refers to one of
       soapbind:body, soapbind:header, soapbind:fault  or soapbind:headerfault
         * Binding 'VF-HTTPS-Binding', in Service Description
           'http://api.voiceforge.com/SOAPI'
         * Binding 'VF-HTTP-Binding', in Service Description
           'http://api.voiceforge.com/SOAPI'
   - WARNING: At least one operation is of an unsupported type and has been
     ignored

Writing file 'VoiceForgeAPI.cs'
//---------------------------------------------------------------

And resulting file, instead of methods having just commented errors like this:
//---------------------------------------------------------------
// WARNING: Could not generate operation binding GetSessionID. The combination of style=rpc with use=literal is not supported
// WARNING: Could not generate operation binding CreateAccount. The combination of style=rpc with use=literal is not supported
// WARNING: Could not generate operation binding GetAccountInfo. The combination of style=rpc with use=literal is not supported
// WARNING: Could not generate operation binding UpdateAccountInfo. The combination of style=rpc with use=literal is not supported
// WARNING: Could not generate operation binding VoiceSearch. The combination of style=rpc with use=literal is not supported
// WARNING: Could not generate operation binding Say. The combination of style=rpc with use=literal is not supported
//---------------------------------------------------------------

1 Ответ

3 голосов
/ 24 мая 2012

Я вижу, что этот WSDL был создан в очень мрачные времена программирования WebServices ...

В любом случае, чтобы иметь возможность выполнить:

wsdl2java.bat -all your.wsdl

необходимо удалить soapAction="http://api.voiceforge.com/SOAPI#GetSessionID" в строке 207. Изменение:

<wsdl:operation name="GetSessionID" soapAction="http://api.voiceforge.com/SOAPI#GetSessionID">

до

<wsdl:operation name="GetSessionID">

потому что спецификация soapAction должна быть помещена в элемент soap:operation extension (WSDL's Soap 1.1 Binding).

Команда wsdl2java -all выдаёт мне эти файлы:

ComplexAudioData.java
ComplexAudioInfo.java
ComplexCreateUserInfo.java
ComplexQuery.java
ComplexQueryResult.java
ComplexQueryResultArray.java
ComplexTextInfo.java
ComplexVoiceInfo.java
ObjectFactory.java
package-info.java
VFHTTPBinding.java
VFHTTPBindingImpl.java
VFHTTPBinding_VFHTTP_Client.java
VFHTTPBinding_VFHTTP_Server.java
VFHTTPSBinding.java
VFHTTPSBindingImpl.java
VFHTTPSBinding_VFHTTPS_Client.java
VFHTTPSBinding_VFHTTPS_Server.java
VoiceForgeAPII.java
VoiceForgeAPIS.java

в com.voiceforge.api.soapi упаковке.

...