?背景
?????? WebServices 是基于開放標準(XML、SOAP、HTTP 等)的 Web 應用程序,它們與其他 Web 應 用程序交互以交換數據。WebServices 可以將您現有的應用程序轉換為 Web 應用程序。
?????? 老代碼中有一個19年前的包,由于漏洞原因,當下已經不能使用,代碼中傳輸xml又都是此包定義:
<dependency><groupId>org.apache.axis</groupId><artifactId>axis-jaxrpc</artifactId><version>${axis.version}</version></dependency><dependency><groupId>axis</groupId><artifactId>axis</artifactId><version>${axis.version}</version></dependency>
評估過后需要升級WebServices所需最新jar,修改傳輸代碼。
下方代碼模擬介紹:
?角色:服務調用方,服務提供方
?接口:1.服務提供方 接收 服務調用方傳入參數,放入隊列后返回調用結果成功。
??????????? 2.服務提供方接收隊列后異步執行業務,業務完畢后 調用服務調用方提供的webservices接口,返回執行結果。
代碼結構
不廢話,直接上代碼
pom.xml
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.5</version><relativePath /> <!-- lookup parent from repository --></parent>......<properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>4.1.1</version></dependency><dependency><groupId>jakarta.xml.ws</groupId><artifactId>jakarta.xml.ws-api</artifactId></dependency><dependency><groupId>jakarta.xml.bind</groupId><artifactId>jakarta.xml.bind-api</artifactId></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
配置文件application.properties
spring.application.name=soap-demo
cxf.path=/webservice
server.port=8080
配置項WebServiceConfig.java
package com.wd.cxf.config;import jakarta.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class WebServiceConfig {// 1) 手動注冊 CXF 的 Bus 實例@Bean(name = Bus.DEFAULT_BUS_ID)public SpringBus springBus() {SpringBus springBus = new SpringBus();springBus.setProperty("soap.no.validate.parts", "true");springBus.setProperty("set-jaxb-validation-event-handler", "false");return springBus;}/** * 其他人調用接口* @param bus* @param impl* @return*/@Beanpublic Endpoint ctmsEndpoint(Bus bus, com.wd.cxf.service.DouziWebServiceImpl impl) {EndpointImpl endpoint = new EndpointImpl(bus, impl);// 發布到 http://localhost:8080/webservice/douziRequestendpoint.publish("/douziRequest");return endpoint;}/*** 模擬其他人的接口,業務執行完畢,調用* @param bus* @param impl* @return*/@Beanpublic Endpoint ctmsResultEndpoint(Bus bus, com.wd.cxf.response.DouziSoapBindingImpl impl) {EndpointImpl endpoint = new EndpointImpl(bus, impl);// 發布到 http://localhost:8080/webservice/douziResultendpoint.publish("/douziResult");return endpoint;}@Beanpublic com.wd.cxf.service.DouziWebServiceImpl douziWebServiceImpl() {return new com.wd.cxf.service.DouziWebServiceImpl();}@Beanpublic com.wd.cxf.response.DouziSoapBindingImpl douziResponseImpl() {return new com.wd.cxf.response.DouziSoapBindingImpl();}
}
服務接口DouziWebService.java
package com.wd.cxf.service;import com.wd.cxf.util.WebServiceResultBean;import jakarta.jws.WebMethod;
import jakarta.jws.WebParam;
import jakarta.jws.WebService;// http://127.0.0.1:8080/webservice/douziRequest?wsdl
// http://localhost:8080/webservice/douziResult?wsdl
@WebService(name = "DouziSoapService", targetNamespace = "douzi")
public interface DouziWebService {/*** 業務入參,不用關心* @param from* @param to* @param contentId* @param xmlUrl* @return*/@WebMethod(operationName = "ExecCmd")WebServiceResultBean ExecCmd(@WebParam(name = "FROM") String from,@WebParam(name = "TO") String to,@WebParam(name = "CONTENTID") String contentId,@WebParam(name = "XMLURL") String xmlUrl);
}
服務實現DouziWebServiceImpl.java
package com.wd.cxf.service;import com.wd.cxf.model.DouziTask;
import com.wd.cxf.response.DouziResponse;
import com.wd.cxf.response.DouziResponseService;
import com.wd.cxf.response.DouziResult;
import com.wd.cxf.util.WebServiceResultBean;
import jakarta.jws.WebService;import java.net.MalformedURLException;/*** 此處模擬背景介紹:* 角色:服務調用方,服務提供方* 接口:1.服務提供方 接收 服務調用方傳入參數,放入隊列后返回調用結果成功。* 2.服務提供方接收隊列后異步執行業務,業務完畢后 調用服務調用方提供的webservices接口,返回執行結果。* @author douzi*/
@WebService(serviceName = "DouziRequest", targetNamespace = "douzi", endpointInterface = "com.wd.cxf.service.DouziWebService")
public class DouziWebServiceImpl implements DouziWebService {@Overridepublic WebServiceResultBean ExecCmd(String from, String to, String contentId, String xmlUrl) {// 業務代碼省略...... // 業務回調 此處模擬業務處理時間很長,需要異步調用,執行完畢后,在把真實的處理結果回調給發送方。DouziTask douziTask = new DouziTask();douziTask.setCmdResult(-1);douziTask.setStatus(2);douziTask.setErrorDescription("數據:" + douziTask.getContentId() + "大屏傳輸ftp路徑對應ftpserver不存在:");java.net.URL portAddress = null;try {portAddress = new java.net.URL("http://127.0.0.1:8080/webservice/douziResult?wsdl");} catch (MalformedURLException e) {throw new RuntimeException(e);}DouziResponse client = new DouziResponseService(portAddress).getCtms();DouziResult cspResult = null;if (client != null) {cspResult = client.resultNotify(douziTask.getFrom(), douziTask.getTo(), douziTask.getContentId(), douziTask.getCmdResult(), douziTask.getXmlUrl());}// 被調用接口返回值WebServiceResultBean requestResultBean = new WebServiceResultBean();requestResultBean.setResult(0);assert cspResult != null;requestResultBean.setErrorDescription(cspResult.toString());return requestResultBean;}
}
返回值WebServiceResultBean.java
package com.wd.cxf.util;import java.io.Serializable;import lombok.Data;
import lombok.NoArgsConstructor;/*** 服務提供方返回結果類* @author douzi*/
@Data
@NoArgsConstructor
public class WebServiceResultBean implements Serializable {private static final long serialVersionUID = 1L;//0,success -1 failprivate int result;private String errorDescription;
}
參數體ExecCmd.java
package com.wd.cxf.model;import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlType;/*** <p>Java class for ExecCmd complex type.* * <p>The following schema fragment specifies the expected content contained within this class.* */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ExecCmd", propOrder = {"FROM","TO","CONTENTID","XMLURL"
})
public class ExecCmd {@XmlElement(name = "FROM")protected String from;@XmlElement(name = "TO")protected String to;@XmlElement(name = "CONTENTID")protected String contentId;@XmlElement(name = "XMLURL")protected String xmlUrl;public String getFrom() {return from;}public void setFrom(String from) {this.from = from;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}public String getContentId() {return contentId;}public void setContentId(String contentId) {this.contentId = contentId;}public String getXmlUrl() {return xmlUrl;}public void setXmlUrl(String xmlUrl) {this.xmlUrl = xmlUrl;}
}
返回對象ExecCmdResponse.java
package com.wd.cxf.model;import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlType;/*** <p>Java class for ExecCmdResponse complex type.* * <p>The following schema fragment specifies the expected content contained within this class.* */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ExecCmdResponse", propOrder = {"_return"
})
public class ExecCmdResponse {@XmlElement(name = "return")protected RequestResultBean _return;/*** Gets the value of the return property.* * @return* possible object is* {@link RequestResultBean }* */public RequestResultBean getReturn() {return _return;}/*** Sets the value of the return property.* * @param value* allowed object is* {@link RequestResultBean }* */public void setReturn(RequestResultBean value) {this._return = value;}}
返回消息體RequestResultBean.java
package com.wd.cxf.model;import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlType;/*** <p>Java class for requestResultBean complex type.* * <p>The following schema fragment specifies the expected content contained within this class.* */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "requestResultBean", propOrder = {"errorDescription","result"
})
public class RequestResultBean {protected String errorDescription;protected int result;/*** Gets the value of the errorDescription property.* * @return* possible object is* {@link String }* */public String getErrorDescription() {return errorDescription;}/*** Sets the value of the errorDescription property.* * @param value* allowed object is* {@link String }* */public void setErrorDescription(String value) {this.errorDescription = value;}/*** Gets the value of the result property.* */public int getResult() {return result;}/*** Sets the value of the result property.* */public void setResult(int value) {this.result = value;}}
ObjectFactory.java
package com.wd.cxf.model;import javax.xml.namespace.QName;import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.annotation.XmlElementDecl;
import jakarta.xml.bind.annotation.XmlRegistry;/*** This object contains factory methods for each * Java content interface and Java element interface * generated in the com.wondertek.mobilevideo.iptvmam.callrequest package. * <p>An ObjectFactory allows you to programatically * construct new instances of the Java representation * for XML content. The Java representation of XML * content can consist of schema derived interfaces * and classes representing the binding of schema * type definitions, element declarations and model * groups. Factory methods for each of these are * provided in this class.* */
@XmlRegistry
public class ObjectFactory {private final static QName _ExecCmdResponse_QNAME = new QName("douzi", "ExecCmdResponse");private final static QName _ExecCmd_QNAME = new QName("douzi", "ExecCmd");/*** Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.wondertek.mobilevideo.iptvmam.callrequest* */public ObjectFactory() {}/*** Create an instance of {@link ExecCmd }* */public ExecCmd createExecCmd() {return new ExecCmd();}/*** Create an instance of {@link ExecCmdResponse }* */public ExecCmdResponse createExecCmdResponse() {return new ExecCmdResponse();}/*** Create an instance of {@link RequestResultBean }* */public RequestResultBean createRequestResultBean() {return new RequestResultBean();}/*** Create an instance of {@link JAXBElement }{@code <}{@link ExecCmdResponse }{@code >}}* */@XmlElementDecl(namespace = "douzi", name = "ExecCmdResponse")public JAXBElement<ExecCmdResponse> createExecCmdResponse(ExecCmdResponse value) {return new JAXBElement<ExecCmdResponse>(_ExecCmdResponse_QNAME, ExecCmdResponse.class, null, value);}/*** Create an instance of {@link JAXBElement }{@code <}{@link ExecCmd }{@code >}}* */@XmlElementDecl(namespace = "douzi", name = "ExecCmd")public JAXBElement<ExecCmd> createExecCmd(ExecCmd value) {return new JAXBElement<ExecCmd>(_ExecCmd_QNAME, ExecCmd.class, null, value);}}
任務表DouziTask.java,入庫記錄
package com.wd.cxf.model;import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;import java.util.Date;/*** 調用回執接口返回消息體* @author douzi*/
@Data
public class DouziTask {private Long id;private Integer direction;/*** XML指令文件的UR*/private String fileUrl;/*** 命令執行結果:0,success,-1,fail 內容回調結果*/private Integer cmdResult;private String contentId;/*** 互相約定的上層標識*/private String from;/*** 互相約定的下層標識*/private String to;/*** 錯誤信息詳細描述*/private String errorDescription;private Integer processes;/*** 響應消息:0,success;-1,fail 工單響應*/private Integer result;/*** 查詢結果XML文件的URL,該字段僅針對查詢結果通知消息出現。*/private String xmlUrl;private String seqnum;/*** 0,待解析,1解析成功,2解析失敗 內容解析狀態*/private Integer status;private Integer version;private String province;private String ip;/*** 創建時間*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date createTime;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date updateTime;/*** 數據狀態: 1、有效;0、刪除*/private Integer effective;private String action;}
業務處理后返回消息接口DouziResponse.java
/*** CSPResponse.java* <p>* This file was auto-generated from WSDL* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.*/package com.wd.cxf.response;import jakarta.jws.WebMethod;
import jakarta.jws.WebParam;
import jakarta.jws.WebService;@WebService(name = "DouziResponse", targetNamespace = "douzi")
public interface DouziResponse {@WebMethod(operationName = "ResultNotify")public DouziResult resultNotify(@WebParam(name = "FROM") String from,@WebParam(name = "TO") String to,@WebParam(name = "COTENTID") String cotentId,@WebParam(name = "CMDRESULT") int cmdResult,@WebParam(name = "XMLURL") String xmlUrl);
}
業務處理后返回消息實現DouziResponseService.java
/*** CSPResponseService.java* <p>* This file was auto-generated from WSDL* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.*/package com.wd.cxf.response;import jakarta.xml.ws.*;import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import java.net.URL;@WebServiceClient(name = "DouziResponseService", targetNamespace = "douzi")
public class DouziResponseService extends Service {private final static URL CSPRESPONSESERVICE_WSDL_LOCATION;private final static WebServiceException CSPRESPONSESERVICE_EXCEPTION;private final static QName CSPRESPONSESERVICE_QNAME = new QName("douzi", "DouziResponseService");static {URL url = null;WebServiceException e = null;try {url = new URL("http://127.0.0.1:8080/webservice/ctmsResult?wsdl");} catch (MalformedURLException ex) {e = new WebServiceException(ex);}CSPRESPONSESERVICE_WSDL_LOCATION = url;CSPRESPONSESERVICE_EXCEPTION = e;}public DouziResponseService() {super(__getWsdlLocation(), CSPRESPONSESERVICE_QNAME);}public DouziResponseService(WebServiceFeature... features) {super(__getWsdlLocation(), CSPRESPONSESERVICE_QNAME, features);}public DouziResponseService(URL wsdlLocation) {super(wsdlLocation, CSPRESPONSESERVICE_QNAME);}public DouziResponseService(URL wsdlLocation, WebServiceFeature... features) {super(wsdlLocation, CSPRESPONSESERVICE_QNAME, features);}protected DouziResponseService(URL wsdlDocumentLocation, QName serviceName) {super(wsdlDocumentLocation, serviceName);}protected DouziResponseService(URL wsdlDocumentLocation, QName serviceName, WebServiceFeature... features) {super(wsdlDocumentLocation, serviceName, features);}/*** @return returns CSPRequest*/@WebEndpoint(name = "DouziSoapBindingImplPort")public DouziResponse getCtms() {return super.getPort(new QName("douzi", "DouziSoapBindingImplPort"), DouziResponse.class);}/*** @param features A list of {@link jakarta.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.* @return returns CSPRequest*/@WebEndpoint(name = "DouziSoapBindingImplPort")public DouziResponse getCtms(WebServiceFeature... features) {return super.getPort(new QName("douzi", "DouziSoapBindingImplPort"), DouziResponse.class, features);}private static URL __getWsdlLocation() {if (CSPRESPONSESERVICE_EXCEPTION != null) {throw CSPRESPONSESERVICE_EXCEPTION;}return CSPRESPONSESERVICE_WSDL_LOCATION;}
}
DouziResult.java
/*** CSPResult.java** This file was auto-generated from WSDL* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.*/package com.wd.cxf.response;import jakarta.xml.bind.annotation.*;@XmlRootElement(name = "DouziResult", namespace = "douzi")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DouziResult", propOrder = {"result","errorDescription"
})
public class DouziResult implements java.io.Serializable {private int result;private String errorDescription;public DouziResult() {}public DouziResult(int result,String errorDescription) {this.result = result;this.errorDescription = errorDescription;}/*** Gets the result value for this CSPResult.* * @return result*/public int getResult() {return result;}/*** Sets the result value for this CSPResult.* * @param result*/public void setResult(int result) {this.result = result;}/*** Gets the errorDescription value for this CSPResult.* * @return errorDescription*/public String getErrorDescription() {return errorDescription;}/*** Sets the errorDescription value for this CSPResult.* * @param errorDescription*/public void setErrorDescription(String errorDescription) {this.errorDescription = errorDescription;}@XmlTransientprivate Object __equalsCalc = null;public synchronized boolean equals(Object obj) {if (!(obj instanceof DouziResult)) return false;DouziResult other = (DouziResult) obj;if (obj == null) return false;if (this == obj) return true;if (__equalsCalc != null) {return (__equalsCalc == obj);}__equalsCalc = obj;boolean _equals;_equals = true && this.result == other.getResult() &&((this.errorDescription==null && other.getErrorDescription()==null) || (this.errorDescription!=null &&this.errorDescription.equals(other.getErrorDescription())));__equalsCalc = null;return _equals;}@XmlTransientprivate boolean __hashCodeCalc = false;public synchronized int hashCode() {if (__hashCodeCalc) {return 0;}__hashCodeCalc = true;int _hashCode = 1;_hashCode += getResult();if (getErrorDescription() != null) {_hashCode += getErrorDescription().hashCode();}__hashCodeCalc = false;return _hashCode;}}
DouziSoapBindingImpl.java
/*** CtmsSoapBindingImpl.java** This file was auto-generated from WSDL* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.*/package com.wd.cxf.response;import jakarta.jws.WebService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;@WebService(endpointInterface = "com.wd.cxf.response.DouziResponse",targetNamespace = "douzi", serviceName = "DouziResponseService")
public class DouziSoapBindingImpl implements DouziResponse{protected Log log = LogFactory.getLog(this.getClass().getName());public DouziResult resultNotify(String from, String to, String contentId, int cmdResult, String xmlUrl) {DouziResult cspr = new DouziResult();try{log.info("resultNotify--------:from="+from+";to="+to+";contentId="+contentId+";cmdResult="+cmdResult+"xmlUrl="+xmlUrl);}catch(Exception ex){cspr.setResult(-1);cspr.setErrorDescription("CMS Task Treat Failure");}log.info("resultNotify resp:"+cspr.toString());return cspr;}}
運行后查看wsdl
服務提供方 接口
http://127.0.0.1:8080/webservice/douziRequest?wsdl
<wsdl:definitions name="DouziRequest" targetNamespace="douzi"><wsdl:types><xs:schema elementFormDefault="unqualified" targetNamespace="douzi" version="1.0"><xs:element name="ExecCmd" type="tns:ExecCmd"/><xs:element name="ExecCmdResponse" type="tns:ExecCmdResponse"/><xs:complexType name="ExecCmd"><xs:sequence><xs:element minOccurs="0" name="FROM" type="xs:string"/><xs:element minOccurs="0" name="TO" type="xs:string"/><xs:element minOccurs="0" name="CONTENTID" type="xs:string"/><xs:element minOccurs="0" name="XMLURL" type="xs:string"/></xs:sequence></xs:complexType><xs:complexType name="ExecCmdResponse"><xs:sequence><xs:element minOccurs="0" name="return" type="tns:webServiceResultBean"/></xs:sequence></xs:complexType><xs:complexType name="webServiceResultBean"></xs:complexType></xs:schema></wsdl:types><wsdl:message name="ExecCmd"><wsdl:part element="tns:ExecCmd" name="parameters"></wsdl:part></wsdl:message><wsdl:message name="ExecCmdResponse"><wsdl:part element="tns:ExecCmdResponse" name="parameters"></wsdl:part></wsdl:message><wsdl:portType name="DouziSoapService"><wsdl:operation name="ExecCmd"><wsdl:input message="tns:ExecCmd" name="ExecCmd"></wsdl:input><wsdl:output message="tns:ExecCmdResponse" name="ExecCmdResponse"></wsdl:output></wsdl:operation></wsdl:portType><wsdl:binding name="DouziRequestSoapBinding" type="tns:DouziSoapService"></wsdl:binding><wsdl:service name="DouziRequest"><wsdl:port binding="tns:DouziRequestSoapBinding" name="DouziWebServiceImplPort"><soap:address location="http://127.0.0.1:8080/webservice/douziRequest"/></wsdl:port></wsdl:service>
</wsdl:definitions>
模擬服務模擬方接口
http://localhost:8080/webservice/douziResult?wsdl
<wsdl:definitions name="DouziResponseService" targetNamespace="douzi"><wsdl:types><xs:schema elementFormDefault="unqualified" targetNamespace="douzi" version="1.0"><xs:element name="DouziResult" type="tns:DouziResult"/><xs:element name="ResultNotify" type="tns:ResultNotify"/><xs:element name="ResultNotifyResponse" type="tns:ResultNotifyResponse"/><xs:complexType name="ResultNotify"><xs:sequence><xs:element minOccurs="0" name="FROM" type="xs:string"/><xs:element minOccurs="0" name="TO" type="xs:string"/><xs:element minOccurs="0" name="COTENTID" type="xs:string"/><xs:element name="CMDRESULT" type="xs:int"/><xs:element minOccurs="0" name="XMLURL" type="xs:string"/></xs:sequence></xs:complexType><xs:complexType name="ResultNotifyResponse"><xs:sequence><xs:element minOccurs="0" name="return" type="tns:DouziResult"/></xs:sequence></xs:complexType><xs:complexType name="DouziResult"><xs:sequence><xs:element name="result" type="xs:int"/><xs:element minOccurs="0" name="errorDescription" type="xs:string"/></xs:sequence></xs:complexType></xs:schema></wsdl:types><wsdl:message name="ResultNotifyResponse"><wsdl:part element="tns:ResultNotifyResponse" name="parameters"></wsdl:part></wsdl:message><wsdl:message name="ResultNotify"><wsdl:part element="tns:ResultNotify" name="parameters"></wsdl:part></wsdl:message><wsdl:portType name="DouziResponse"><wsdl:operation name="ResultNotify"><wsdl:input message="tns:ResultNotify" name="ResultNotify"></wsdl:input><wsdl:output message="tns:ResultNotifyResponse" name="ResultNotifyResponse"></wsdl:output></wsdl:operation></wsdl:portType><wsdl:binding name="DouziResponseServiceSoapBinding" type="tns:DouziResponse"><soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="ResultNotify"><soap:operation soapAction="" style="document"/><wsdl:input name="ResultNotify"><soap:body use="literal"/></wsdl:input><wsdl:output name="ResultNotifyResponse"><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service name="DouziResponseService"><wsdl:port binding="tns:DouziResponseServiceSoapBinding" name="DouziSoapBindingImplPort"><soap:address location="http://localhost:8080/webservice/douziResult"/></wsdl:port></wsdl:service>
</wsdl:definitions>