2011-08-31 10 views
17

Generuję kod klienta java z pliku wsdl, używając "wsimport". WSDL zawiera mydła: nagłówek w definicjach operacyjnych takich jak tenwsimport nie generuje kodu związanego z nagłówkami mydła

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.test.com/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://www.test.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Test session web service methods.</wsdl:documentation> 
    <wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://www.test.com/"> 
     <s:element name="Logon"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="user" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="organisation" type="s:string" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:element name="LogonResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="LogonResult" type="tns:LogonResult" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:simpleType name="LogonResult"> 
     <s:restriction base="s:string"> 
      <s:enumeration value="Ok" /> 
      <s:enumeration value="Error" /> 
     </s:restriction> 
     </s:simpleType> 
     <s:element name="Header" type="tns:Header" /> 
     <s:complexType name="Header"> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="SessionID" type="s:string" /> 
     </s:sequence> 
     <s:anyAttribute /> 
     </s:complexType> 
     <s:element name="RunTask"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="argument" type="s:string" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:element name="RunTaskResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="RunTaskResult" type="tns:RunTaskResult" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:simpleType name="RunTaskResult"> 
     <s:restriction base="s:string"> 
      <s:enumeration value="Ok" /> 
      <s:enumeration value="Error" /> 
     </s:restriction> 
     </s:simpleType> 
    </s:schema> 
    </wsdl:types> 
    <wsdl:message name="LogonSoapIn"> 
    <wsdl:part name="parameters" element="tns:Logon" /> 
    </wsdl:message> 
    <wsdl:message name="LogonSoapOut"> 
    <wsdl:part name="parameters" element="tns:LogonResponse" /> 
    </wsdl:message> 
    <wsdl:message name="LogonHeader"> 
    <wsdl:part name="Header" element="tns:Header" /> 
    </wsdl:message> 
    <wsdl:message name="RunTaskSoapIn"> 
    <wsdl:part name="parameters" element="tns:RunTask" /> 
    </wsdl:message> 
    <wsdl:message name="RunTaskSoapOut"> 
    <wsdl:part name="parameters" element="tns:RunTaskResponse" /> 
    </wsdl:message> 
    <wsdl:message name="RunTaskHeader"> 
    <wsdl:part name="Header" element="tns:Header" /> 
    </wsdl:message> 
    <wsdl:portType name="SessionSoap"> 
    <wsdl:operation name="Logon"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Logs on with the user credentials.</wsdl:documentation> 
     <wsdl:input message="tns:LogonSoapIn" /> 
     <wsdl:output message="tns:LogonSoapOut" /> 
    </wsdl:operation> 
    <wsdl:operation name="RunTask"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Runs a task.</wsdl:documentation> 
     <wsdl:input message="tns:RunTaskSoapIn" /> 
     <wsdl:output message="tns:RunTaskSoapOut" /> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="SessionSoap" type="tns:SessionSoap"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="Logon"> 
     <soap:operation soapAction="http://www.test.com/Logon" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     <soap:header message="tns:LogonHeader" part="Header" use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    <wsdl:operation name="RunTask"> 
     <soap:operation soapAction="http://www.test.com/RunTask" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     <soap:header message="tns:RunTaskHeader" part="Header" use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="Session"> 
    <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Test session web service methods.</wsdl:documentation> 
    <wsdl:port name="SessionSoap" binding="tns:SessionSoap"> 
     <soap:address location="https://login.test.com/webservices/session.asmx" /> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Oznacza to, że komunikat żądania logowania wyglądałby następująco

<?xml version="1.0"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XmlSchema-instance" xmlns:xsd="http://www.w3.org/2001/XmlSchema"> 
    <soap:Body> 
    <Logon xmlns="http://www.test.com/"> 
     <user>its_me</user> 
     <password>its_my_pwd</password> 
     <organisation>my_org</organisation> 
    </Logon> 
    </soap:Body> 
</soap:Envelope> 

i odpowiedzi jak ten

<?xml version="1.0"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Header> 
    <Header xmlns="http://www.test.com/"> 
     <SessionID>ddffdf334-217d-41bb-9d7e-6289fefa8aaf</SessionID> 
    </Header> 
    </soap:Header> 
    <soap:Body> 
    <LogonResponse xmlns="http://www.test.com/"> 
     <LogonResult>Ok</LogonResult> 
    </LogonResponse> 
    </soap:Body> 
</soap:Envelope> 
+11

Yay, znalazłem to sam. Dodanie opcji "-XadditionalHeaders" do polecenia wsimport rozwiązało problem. Generuje dodatkowy argument dla metody, za pomocą której można przekazać/pobrać nagłówek. Nie usunąłem tego pytania, ponieważ nie byłem w stanie znaleźć tego rozwiązania na przepełnieniu stosu i jako takie może być przydatne – thehpi

+1

Dzięki! .. ps: To jest najlepsze trafienie dla "nagłówka ustawień wsimportu" w google! –

Odpowiedz

1

I nie mogę tego komentować, więc piszę to tutaj jako "odpowiedź".

Wpadłem na tę samą sytuację, w której w kopercie było tylko ciało. Jednak po dodaniu argumentu "-XadditionalHeaders" program wsimport nadal odmawiał generowania metod serwisowych z argumentami nagłówka. Szukałem w internecie i znalazłem ręczną poprawkę w poniższy link:

https://metro.java.net/2.0/guide/SOAP_headers.html

To nie ja w kodzie. Zamiast tego zmieniłem sygnaturę metody działania usługi sieci Web, dodając argumenty dla nagłówka żądania i dodając do nich adnotacje z @WebParam(header=true). Nie przetestowałem tego z prawdziwym serwerem usług internetowych, ale przynajmniej komunikat SOAP wygląda teraz poprawnie (już bez nagłówka).

0

-exsh (prawda/fałsz)

Włącza lub wyłącza przetwarzanie ukrytych nagłówków SOAP (tj nagłówki SOAP zdefiniowane w WSDL: wiązania, ale nie WSDL. Sekcję portType) tworzenie nagłówków SOAP wymaga wiązania słoiki SOAP dostępne w ścieżce klas, która nie była domyślna w CXF 2.4.x i starszych. Aby ta flaga działała, może być konieczne dodanie zależności do csf-rt-binding-soap. Domyślna wartość to fałsz.

Powiązane problemy