当前位置: 首页 > news >正文

升级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.xdnf.cn/news/576847.html

相关文章:

  • 数字化,一个泛化的概念
  • 使用Mathematica生成随机曼陀罗花
  • vue3请求设置responseType: ‘blob‘,导致失败后获取不到返回信息
  • 基于vue框架的动漫论坛g2392(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • ISO 26262-5 硬件验证
  • Python雷达图实战教程:从入门到精通
  • 磁盘分区与挂载——笔记
  • 深入理解Java虚拟机之垃圾收集器篇(垃圾回收器的深入解析待完成TODO)
  • 框架与组件版本备忘
  • LlamaIndex
  • Keepalived 基于 VRRP 的高可用设计与故障排查
  • 学习日记-day12-5.21
  • 牛客网 NC16407 题解:托米航空公司的座位安排问题
  • 操作系统 第四章 -1
  • 链表-反转链表
  • JUC并发编程(下)
  • P1090 [NOIP 2004 提高组] 合并果子
  • SpringBoot3集成Oauth2.1——3access_token使用
  • 大模型如何助力数学可视化?
  • 47道ES67高频题整理(附答案背诵版)
  • LVS_DR集群的基本原理和相关配置
  • 算法总结:双指针技巧
  • XXE由浅入深
  • SOC-ESP32S3部分:4-参数配置可视化menuconfig
  • 啤酒游戏与系统思考
  • RESTful API设计:从原则到Gin实现
  • 【AI模型学习】ESM2
  • 部署rsync远程同步+inotify监控
  • 前端学习(6)—— WebAPI部分案例
  • 前端面经-WebGL/threeJS