升級SpringBoot2到3導致的WebServices升級

?背景

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

Soap測試:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81951.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81951.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81951.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue3中插槽, pinia的安裝和使用(超詳細教程)

1. 插槽 插槽是指, 將一個組件的代碼片段, 引入到另一個組件。 1.1 匿名插槽 通過簡單的案例來學習匿名插槽&#xff0c;案例說明&#xff0c;在父組件App.vue中導入了子組件Son1.vue&#xff0c;父組件引用子組件的位置添加了一個片段&#xff0c;比如h2標簽&#xff0c;然…

【Redis】AOF日志

目錄 1、背景2、工作原理3、核心配置參數4、優缺點5、AOF文件內容 1、背景 AOF&#xff08;Append Only File&#xff09;是redis提供的持久化機制之一&#xff0c;它通過記錄所有修改數據庫狀態的寫命令來實現數據庫持久化。與RDB&#xff08;快照&#xff09;方式不同&#…

【HTTP】connectionRequestTimeout與connectTimeout的本質區別

今天發現有的伙伴調用第三方 httpclient 的配置中 connectTimeout 和 connectionRequestTimeout 配置的不到 1 S&#xff0c;問了一下他&#xff0c;知不知道這兩個參數的意思&#xff0c;他說不知道。那我們今天就來了解一下這兩個參數的區別 一、核心概念解析 1.1 connectT…

react中運行 npm run dev 報錯,提示vite.config.js出現錯誤 @esbuild/win32-x64

在React項目中運行npm run dev時&#xff0c;如果遇到vite.config.js報錯&#xff0c;提示esbuild/win32-x64在另一個平臺中被使用&#xff0c;通常是由于依賴沖突或緩存問題導致的。解決方法是刪除node_modules文件夾&#xff0c;并重新安裝依賴。 如下圖&#xff1a; 解決辦…

EMQX開源版安裝指南:Linux/Windows全攻略

EMQX開源版安裝教程-linux/windows 因最近自己需要使用MQTT&#xff0c;需要搭建一個MQTT服務器&#xff0c;所以想到了很久以前用到的EMQX。但是當時的EMQX使用的是開源版的&#xff0c;在官網可以直接下載。而現在再次打開官網時發現怎么也找不大開源版本了&#xff0c;所以…

Python:操作Excel按行寫入

Python按行寫入Excel數據,5種實用方法大揭秘! 在日常的數據處理和分析工作中,我們經常需要將數據寫入到Excel文件中。Python作為一門強大的編程語言,提供了多種庫和方法來實現將數據按行寫入Excel文件的功能。本文將詳細介紹5種常見的Python按行寫入Excel數據的方法,并附上…

vue3中RouterView配合KeepAlive實現組件緩存

KeepAlive組件緩存 為什么需要組件緩存代碼展示緩存效果為什么不用v-if 為什么需要組件緩存 業務需求&#xff1a;一般是列表頁面通過路由跳轉到詳情頁&#xff0c;跳轉回來時&#xff0c;需要列表頁面展示上次展示的內容 代碼展示 App.vue入口 <script setup lang"…

【JAVA】比較器Comparator與自然排序(28)

JAVA 核心知識點詳細解釋 Java中比較器Comparator的概念和使用方法 概念 Comparator 是 Java 中的一個函數式接口,位于 java.util 包下。它用于定義對象之間的比較規則,允許我們根據自定義的邏輯對對象進行排序。與對象的自然排序(實現 Comparable 接口)不同,Comparat…

浪潮服務器配置RAID和JBOD

目錄 1 配置RAID2 設置硬盤為JBOD模式3 驗證結果 1 配置RAID 進入 bios 界面 選擇 “高級” - “UEFI-HII配置” 選擇 raid 卡 進入 Main Menu 點擊 Driver Management&#xff0c;可以查詢當前硬盤 返回上一級&#xff0c;點擊 Configuration Management - Create virtu…

mongodb管理工具的使用

環境&#xff1a; 遠程服務器的操作系統&#xff1a;centOS stream 9; mongoDB version:8.0; 本地電腦 navicat premium 17.2 ; 寶塔上安裝了mongoDB 目的&#xff1a;通過本地的navicat鏈接mongoDB,如何打通鏈接&#xff0c;分2步&#xff1a; 第一步&#xff1a;寶塔-&…

03-Web后端基礎(Maven基礎)

1. 初始Maven 1.1 介紹 Maven 是一款用于管理和構建Java項目的工具&#xff0c;是Apache旗下的一個開源項目 。 Apache 軟件基金會&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受歡迎的開源軟件基金會&#xff0c;也是一個專門為支持開源項目而生的非盈利性…

實景VR展廳制作流程與眾趣科技實景VR展廳應用

實景VR展廳制作是一種利用虛擬現實技術將現實世界中的展覽空間數字化并在線上重現的技術。 這種技術通過三維重建和掃描等手段&#xff0c;將線下展館的場景、展品和信息以三維形式搬到云端數字空間&#xff0c;從而實現更加直觀、立體的展示效果。在制作過程中&#xff0c;首…

Python爬蟲實戰:獲取天氣網最近一周北京的天氣數據,為日常出行做參考

1. 引言 隨著互聯網技術的發展,氣象數據的獲取與分析已成為智慧城市建設的重要組成部分。天氣網作為權威的氣象信息發布平臺,其數據具有較高的準確性和實時性。然而,人工獲取和分析天氣數據效率低下,無法滿足用戶對精細化、個性化氣象服務的需求。本文設計并實現了一套完整…

幾種超聲波芯片的特點和對比

一 CX20106A ZIP - 8 CX20106A ZIP - 8 的核心競爭力在于高性價比、易用性和抗光干擾能力&#xff0c;尤其適合消費電子、短距離工業檢測和低成本物聯網場景。盡管在距離和精度上不及高端芯片&#xff0c;但其成熟的電路方案和廣泛的市場應用&#xff08;如經典紅外遙控升級為超…

利用ffmpeg截圖和生成gif

從視頻中截取指定數量的圖片 ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpgffmpeg -i input.mp4 -ss 00:00:10 -vframes 180 output.jpg -vframes 180代表截取180幀, 實測后發現如果視頻是60fps,那么會從第10秒截取到第13秒-i input.mp4&#xff1a;指定輸入視頻文…

系統架構設計師案例分析題——數據庫緩存篇

一.核心知識 1.redis和MySQL的同步方案怎么做的&#xff1f; 讀數據&#xff1a;先查詢緩存&#xff0c;緩存不存在則查詢數據庫&#xff0c;然后將數據新增到緩存中寫數據&#xff1a;新增時&#xff0c;先新增數據庫&#xff0c;數據庫成功后再新增緩存&#xff1b;更新和刪…

什么是智能體?

什么是智能體&#xff1f; 智能體&#xff08;AI Agent&#xff09;是一種能夠自主感知環境、做出決策并執行任務的智能實體&#xff0c;其核心依賴大型語言模型&#xff08;LLM&#xff09;或深度學習算法作為“大腦”模塊。它通過感知模塊&#xff08;如多模態輸入&#xff…

企業數字化轉型是否已由信息化+自動化向智能化邁進?

DeepSeek引發的AI熱潮迅速蔓延到了各個行業&#xff0c;目前接入DeepSeek的企業&#xff0c;涵蓋了科技互聯網、云服務、電信、金融、能源、汽車、手機等熱門領域&#xff0c;甚至全國各地政府機構也紛紛引入。 在 DeepSeek 等國產 AI 技術的推動下&#xff0c;眾多企業已經敏銳…

廣州卓遠VR受邀參加2025智能體育典型案例調研活動,并入駐國體華為運動健康聯合實驗室!

近日&#xff0c;“2025年智能體育典型案例調研活動”在東莞松山湖成功舉辦。本次調研活動由國家體育總局體育科學研究所和中國信息通信研究院聯合主辦&#xff0c;旨在深入貫徹中央關于培育新型消費的戰略部署&#xff0c;通過激活智能健身產品消費潛力&#xff0c;加快運動健…

springboot+vue實現鮮花商城系統源碼(帶用戶協同過濾個性化推薦算法)

今天教大家如何設計一個 鮮花商城 , 基于目前主流的技術&#xff1a;前端vue3&#xff0c;后端springboot。學習完這個項目&#xff0c;你將來找工作開發實際項目都會又很大幫助。文章最后部分還帶來的項目的部署教程。 系統有著基于用戶的協同過濾推薦算法&#xff0c;還有保證…