我需要从一个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>
可以正常工作,只是因为soupUI
用soupUI
标记包裹请求属性:
<request>
我想知道这是服务器合同的一个问题吗?我怎样才能轻松解决这个问题?
答案 0 :(得分:0)
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 WS
和maven-jaxb2-plugin
与旧的SOAP合同存在兼容性问题。