2016-06-07 13 views
0

Ich versuche, einen SOAP-Web-Service von Drittanbietern mit Camel & CXF aufrufen. Hier ist ein Ausschnitt aus dem WSDLCamel CXF Wsdl2java Problem

<message name="setDeviceDetailsv4"> 
     <part name="parameters" element="tns:setDeviceDetailsv4"></part> 
     <part name="gdspHeader" element="tns:gdspHeader"></part> 
    </message> 
    <message name="setDeviceDetailsv4Response"> 
     <part name="result" element="tns:setDeviceDetailsv4Response"></part> 
    </message> 
    <portType name="SetDeviceDetailsv4"> 
     <operation name="setDeviceDetailsv4" parameterOrder="parameters gdspHeader"> 
      <input message="tns:setDeviceDetailsv4"></input> 
      <output message="tns:setDeviceDetailsv4Response"></output> 
     </operation> 
    </portType> 
    <binding name="SetDeviceDetailsv4PortBinding" type="tns:SetDeviceDetailsv4"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding> 
     <operation name="setDeviceDetailsv4"> 
      <soap:operation soapAction=""></soap:operation> 
      <input> 
       <soap:body use="literal" parts="parameters"></soap:body> 
       <soap:header message="tns:setDeviceDetailsv4" part="gdspHeader" use="literal"></soap:header> 
      </input> 
      <output> 
       <soap:body use="literal"></soap:body> 
      </output> 
     </operation> 
    </binding> 
    <service name="SetDeviceDetailsv4Service"> 
     <port name="SetDeviceDetailsv4Port" binding="tns:SetDeviceDetailsv4PortBinding"> 
      <soap:address location="http://localhost:${HttpDefaultPort}/GDSPWebServices/SetDeviceDetailsv4Service"></soap:address> 
     </port> 
    </service> 

Wie man sehen kann, die Seifenkörper „Parameter“ Teil verwendet, welches in der WSDL oben erwähnt ist, bezogen auf tns: setDeviceDetailsv4.

Das Beispiel Client-Code sieht wie folgt aus:

System.out.println("Invoking setDeviceDetailsv4..."); 
     SetDeviceDetailsv4_Type _setDeviceDetailsv4_parameters = null; 
     GdspHeader _setDeviceDetailsv4_gdspHeader = null; 
     SetDeviceDetailsv4Response _setDeviceDetailsv4__return = port.setDeviceDetailsv4(_setDeviceDetailsv4_parameters, _setDeviceDetailsv4_gdspHeader); 
     System.out.println("setDeviceDetailsv4.result=" + _setDeviceDetailsv4__return); 

Wenn ich einen Anruf durch mein Kamel Weg machen, die den Client-Code oben übereinstimmt, erwartete ich CXF/Camel die „gdspHeader“, um die Seife zu anhängen Header aber es ist nicht, es sendet es als Parameter an die Web-Methode. Eine separate Entwicklerhand codiert den SOAP Call und hier ist was er hatte und es funktioniert perfekt !!

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.gdsp.xxxxxxx.com/"> 
    <soapenv:Header> 
     <ws:gdspHeader> 
      <gdspCredentials> 
       <userId>xxxx</userId> 
       <password>xxxx</password> 
      </gdspCredentials> 
     </ws:gdspHeader> 
    </soapenv:Header> 
    <soapenv:Body> 
     <ws:setDeviceDetailsv4> 
      <deviceId>xxxxxx</deviceId> 
      <state>x</state> 
     </ws:setDeviceDetailsv4> 
    </soapenv:Body> 
</soapenv:Envelope> 

Doch wenn ich einen Anruf über Camel machen, hier ist das, was ich als SOAP-Nachricht erhalten:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
     <ns2:gdspHeader xmlns:ns2="http://ws.gdsp.xxxx.com/"> 
      <gdspCredentials> 
       <password>xxxx</password> 
       <userId>xxxx</userId> 
      </gdspCredentials> 
     </ns2:gdspHeader> 
    </soap:Header> 
    <soap:Body> 
     <ns1:setDeviceDetailsv4 xmlns:ns1="http://ws.gdsp.Xxxxx.com/"> 
      <ns2:arg0 xmlns:ns2="http://ws.gdsp.xxx.com/"> 
       <deviceId>xxxx</deviceId> 
       <state>x</state> 
      </ns2:arg0> 
      <ns2:arg1 xmlns:ns2="http://ws.gdsp.xxxx.com/"> 
       <gdspCredentials> 
        <password>xxxx</password> 
        <userId>xxxx</userId> 
       </gdspCredentials> 
      </ns2:arg1> 
     </ns1:setDeviceDetailsv4> 
    </soap:Body> 
</soap:Envelope> 

und es funktioniert nicht. Ich habe versucht, die gdspCredentials NULL zu machen, und das funktioniert nicht, und wenn ich nur einen Parameter übergebe, löst CXF einen Soap-Fehler aus, der besagt, dass die Methode zwei Parameter benötigt. Hier

ist ein Teil meiner pom.xml Datei

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-codegen-plugin</artifactId> 
     <version>2.7.7</version> 
     <executions> 
      <execution> 
      <id>generate-sources</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <wsdlOptions> 
       <wsdlOption> 
        <frontEnd>jaxws21</frontEnd> 
        <faultSerialVersionUID>1</faultSerialVersionUID> 
        <wsdl>src/main/resources/wsdl/extWebServices.wsdl</wsdl> 
        <extraargs> 
        <extraarg>-client</extraarg> 
        </extraargs> 
       </wsdlOption> 
       </wsdlOptions> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

Wie kann ich mein Kamel/CXF Anruf erhalten zu entsprechen, was der andere Entwickler getan hatte?

Antwort

0

Die WSDL funktionierte nicht für meine Bedürfnisse aus der Box. Ich war in der Lage, die WSDL zu ändern, um die "Header" -Option zu entfernen und einen Interzeptor für den Header-Abschnitt und einen Prozessor verwenden, um die Antwort & Anfrage Marshalling/Unmarshalling behandeln.

Verwandte Themen