升级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.mzph.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;还有保证…