2017-02-22 47 views
0

Мне нужно использовать один веб-сервис супа из одного файла WSDL. Я хочу использовать spring WS и maven-jaxb2-plugin, чтобы решить эту проблему. WS-сервер может использовать один старый контракт SOAP. Я нашел что-то вроде <soap:operation soapAction="" style="rpc"/> в файле WSDL. Файл WSDL:Весна WS требует свойств запроса на перенос с «запросом» в старом контракте WS

<?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> 

Первый раз, maven-jaxb2-plugin автоматически генерировать Java Beans из файла WSDL. Но тогда нет тега @XmlRootElement. Поэтому я вручную деформирую <xs:complexType> с <xs:element> в файле WSDL. И это работает.

Затем отправлю запрос на сервер. Он сказал мне Found element accountName but could not find matching RPC/Literal part. Запрос в журнале, как это:

<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> 

Я нахожу soupUI может работать, только потому, что soupUI завернуть свойства запроса с <request> тегом:

<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> 

Я хочу знать, это один вопрос контракта сервера? Как я могу легко решить это?

ответ

0

wsimport инструмент в JDK спаси меня.
Шаг 1, генерировать Java-файлы:

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

Шаг 2, скопируйте файлы проекта и вызывать:

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)); 

Я думаю spring WS и maven-jaxb2-plugin имеют проблемы совместимости со старым контрактом SOAP.