2017-02-22 2 views
0

Wrap Anforderung Eigenschaften Ich brauche einen Suppen-Web-Service aus einer WSDL-Datei konsumieren. Ich möchte spring WS und maven-jaxb2-plugin verwenden, um dies zu lösen. Der WS-Server kann einen alten SOAP-Vertrag verwenden. Ich finde etwas wie <soap:operation soapAction="" style="rpc"/> in der WSDL-Datei. Die WSDL-Datei:Frühling WS muss mit Eigenschaften "Anfrage" in alten WS-Vertrag

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"  xmlns:tns="http://impl.sub.xxx.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http"  name="hahaPaymentWSImpl" targetNamespace="http://impl.sub.xxx.com/"> 
    <wsdl:types> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://impl.sub.xxx.com/" targetNamespace="http://impl.sub.xxx.com/" version="1.0"> 

    <xs:complexType name="singlePaymentRequest"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="accountName" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="singlePaymentResponse"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="amount" type="xs:double"/> 
    </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

    </wsdl:types> 

    <wsdl:message name="singlePayment"> 
    <wsdl:part name="request" type="tns:singlePaymentRequest"> 
    </wsdl:part> 
    </wsdl:message> 
    <wsdl:message name="singlePaymentResponse"> 
    <wsdl:part name="return" type="tns:singlePaymentResponse"> 
    </wsdl:part> 
    </wsdl:message> 

    <wsdl:portType name="hahaPaymentWS"> 
    <wsdl:operation name="singlePayment"> 
     <wsdl:input message="tns:singlePayment" name="singlePayment"> 
    </wsdl:input> 
     <wsdl:output message="tns:singlePaymentResponse" name="singlePaymentResponse"> 
    </wsdl:output> 
    </wsdl:operation> 
    </wsdl:portType> 

    <wsdl:binding name="hahaPaymentWSImplSoapBinding" type="tns:hahaPaymentWS"> 
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="singlePayment"> 
     <soap:operation soapAction="" style="rpc"/> 
     <wsdl:input name="singlePayment"> 
     <soap:body namespace="http://impl.sub.xxx.com/" use="literal"/> 
     </wsdl:input> 
     <wsdl:output name="singlePaymentResponse"> 
     <soap:body namespace="http://impl.sub.xxx.com/" use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 

    <wsdl:service name="hahaPaymentWSImpl"> 
    <wsdl:port binding="tns:hahaPaymentWSImplSoapBinding" name="hahaPaymentWSPort"> 
     <soap:address location="http://999.00.837.212:8888/services/hahaPaymentWS"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Zum ersten Mal, maven-jaxb2-plugin Auto erzeugen, um den Java-Beans aus der WSDL-Datei. Aber dann haben Sie kein @XmlRootElement Tag. Also ich manuell <xs:complexType> mit <xs:element> in WSDL-Datei Warp. Und es funktioniert.

Dann sende ich Anfrage an den Server. Er sagt mir Found element accountName but could not find matching RPC/Literal part. Die Anforderung in Protokoll wie folgt aus:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <ns3:singlePayment xmlns:ns3="http://impl.sub.xxx.com/"> 
     <accountName>xxx</accountName> 
     </ns3:singlePayment> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Ich finde soupUI arbeiten können, nur weil soupUI wickeln Sie die Anfrage Eigenschaften mit <request> tag:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <ns3:singlePayment xmlns:ns3="http://impl.sub.xxx.com/"> 
<request> 
     <accountName>xxx</accountName> 
</request> 
     </ns3:singlePayment> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

I ist dies eine Frage der Server Vertrag wissen? Wie kann ich das leicht lösen?

Antwort

0

wsimport Werkzeug in JDK rette mich.
Schritt 1, erzeugen Java-Dateien:

wsimport -keep -verbose http://xxxx/xxx.wsdl 

Schritt 2, Dateien kopieren und aufrufen zu projizieren:

ObjectFactory objectFactory = new ObjectFactory(); 
SinglePaymentRequest request = objectFactory.createSinglePaymentRequest(); 
request.setAccountFlag("0"); 
hahaPaymentWS hahaPaymentWS = new hahaPaymentWSImpl().gethahaPaymentWSPort(); 
SinglePaymentResponse response = hahaPaymentWS.singlePayment(request); 
System.out.println(JSON.toJSONString(response)); 

Ich denke spring WS und maven-jaxb2-plugin Kompatibilitätsproblem mit alten SOAP Vertrag haben.

Verwandte Themen