spring WS需要在旧的WS合约中使用“request”包装请求属性

时间:2017-02-22 16:07:36

标签: java spring web-services soap wsdl

我需要从一个WSDL文件中使用一个汤Web服务。我希望使用def waiting_time(elements, start_time=0): next_patient_waits = start_time for i in elements: print("{:.1f}".format(next_patient_waits)) next_patient_waits += waiting(i) spring WS来解决此问题。 WS服务器可以使用一个旧的SOAP合同。我在WSDL文件中找到类似maven-jaxb2-plugin的东西。 WSDL文件:

<soap:operation soapAction="" style="rpc"/>

第一次,<?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> 从WSDL文件中自动生成Java bean。但是没有maven-jaxb2-plugin标签。所以我在WSDL文件中用@XmlRootElement手动变形<xs:complexType>。它有效。

然后,我向服务器发送请求。它告诉我<xs:element>。日志中的请求如下:

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> 可以正常工作,只是因为soupUIsoupUI标记包裹请求属性:

<request>

我想知道这是服务器合同的一个问题吗?我怎样才能轻松解决这个问题?

1 个答案:

答案 0 :(得分:0)

JDK中的

wsimport工具救了我 第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 WSmaven-jaxb2-plugin与旧的SOAP合同存在兼容性问题。