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

SpringBoot集成WebService

SpringBoot集成WebService

1.引入pom依赖

<dependencies><!-- 引入Spring Boot Web Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 引入Spring Boot Web Services Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId></dependency><!-- 引入Apache CXF Spring Boot Starter for JAX-WS --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.3.0</version></dependency><dependency><groupId>axis</groupId><artifactId>axis</artifactId><version>1.4</version></dependency><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency><!-- 引入Spring Boot Test Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

2.配置webservice

@Configuration
@ConditionalOnClass(CXFServlet.class)
public class WebServiceConfig {@Autowiredprivate TestService testService;@Value("${spring.webservices.path}")private String path;/*** 自动注入Spring Bus实例,它是CXF的核心组件之一,用于管理和配置CXF运行时环境。*/@Autowiredprivate SpringBus bus;/*** 创建并返回Webservice端点(Endpoint)实例,用于发布MyWebService服务。* 将服务实现类与Spring Bus关联,并指定发布地址为"/tax"。** @return Webservice端点实例*/@Beanpublic Endpoint endpoint() {EndpointImpl endpoint = new EndpointImpl(bus, testService);endpoint.publish("/test"); // 发布地址return endpoint;}/*** 创建并返回CXF Servlet的ServletRegistrationBean实例,用于注册CXF Servlet到Spring Boot的Servlet容器中。* 设置CXF Servlet的映射路径为"/services/*",表示所有以"/services/"开头的HTTP请求都将由CXF Servlet处理。** @return CXF Servlet的ServletRegistrationBean实例*/@Beanpublic ServletRegistrationBean wsServlet() {return new ServletRegistrationBean(new CXFServlet(), path+"/*");}
}

3. 编写WebService服务


@WebService(name = "testService",targetNamespace = "http://www.test.com")
public interface TestService{/*** 推送信息* @param xml* @return xml*/@WebMethod(operationName = "pushTest")@WebResult(name = "xml") String pushTest(@WebParam(name="bwlx")String bwlx,@WebParam(name="xml") String xml);/*** 接收返回信息* @param xml* @return xml*/@WebMethod(operationName = "receiveTaxFee")@WebResult(name = "xml") String receiveTaxFee(@WebParam(name="xml") String xml);
}@Service
@WebService(name = "testService",targetNamespace = "http://www.test.com",
endpointInterface = "com.test.webservice.service.TestService")
public class TestServiceImpl implements TestService{private Logger logger = LoggerFactory.getLogger(TaxServiceImpl.class.getName());@Autowiredprivate Environment environment;@Value("${tax.department.url}")private String url;@Value("${tax.department.nameSpace}")private String nameSpace;@Value("${tax.department.method}")private String method;@Overridepublic String pushTaxFee(String bwlx,String xml) {return sendXML(url,nameSpace,method,xml,bwlx);}@Overridepublic String receiveTest(String srcXML) {//返回logger.info("testreceive request:" + srcXML);String xml="";try {//解析报文Map<String, Object>  param = parseXml(srcXML);//机构标识String jgbs =param.get("JGBS").toString();String url = environment.getProperty("district."+jgbs+".url");String nameSpace = environment.getProperty("district."+jgbs+".nameSpace");String method = environment.getProperty("district."+jgbs+".method");//转发报文return sendXML(url,nameSpace,method,srcXML,"");//返回} catch (DocumentException e) {throw new RuntimeException(e);}}/*** 推送报文* @param url 地址* @param method 方法名* @param xml 请求xml* @param bwlx 第一个参数* @return*/private String sendXML(String url,String nameSpace,String method,String xml,String bwlx) {try {logger.info("push url:" + url);logger.info("push method:" + method);logger.info("push start:");logger.info("send bwlx:" + bwlx);logger.info("send xml:" + xml);org.apache.axis.client.Service service = new org.apache.axis.client.Service();Call call = (Call) service.createCall();call.setTargetEndpointAddress(new URL(url));call.setOperationName(new QName(nameSpace, method));//Client client = JaxWsDynamicClientFactory.newInstance().createClient(url);Object[] args = !StringUtils.isEmpty(bwlx)?new Object[]{bwlx, xml}:new Object[]{xml};/*Object[] retObject = client.invoke(new QName(nameSpace, method), args);for(Object object : retObject){logger.info("返回数据:" + object.toString());}logger.info("result:" + retObject);*/String resultXml = (String) call.invoke(args);logger.info("result:" + resultXml);logger.info("end");//return retObject[0].toString();return resultXml;} catch (Exception e) {logger.error("请求发生错误:", e);if (e instanceof ConnectException) {return "接口连接超时,请联系管理员!";}return e.getMessage();}}

注意事项
webservice发送请求有以下方式,推荐方法2
方法1


Client client = JaxWsDynamicClientFactory.newInstance().createClient(url);
Object[] args = !StringUtils.isEmpty(bwlx)?new Object[]{bwlx, xml}:new Object[]{xml};
Object[] retObject = client.invoke(new QName(nameSpace, method), args);

方法2

 Call call = (Call) service.createCall();call.setTargetEndpointAddress(new URL(url));call.setOperationName(new QName(nameSpace, method));Object[] args = !StringUtils.isEmpty(bwlx)?new Object[]{bwlx, xml}:new Object[]{xml};String resultXml = (String) call.invoke(args);

两种方法都可以发送请求,在实际使用中发现方法一种的请求url 如果被转发代理,发送请求时发现实际请求为代理前的地址,会导致无法访问转发后的地址。

4.配置properties

server.port=8090
spring.webservices.path=/services

5.启动应用访问

http:localhost:8090/services/test?wsdl

http://www.dtcms.com/a/341311.html

相关文章:

  • BioScientist Agent:用于药物重定位和作用机制解析的知识图谱增强型 LLM 生物医学代理技术报告
  • docker CI操作演示分享(第四期)
  • Fastdata极数:中国外卖行业趋势报告2025
  • 网络流量分析——基础知识
  • [特殊字符] 从文件到视频:日常数据修复全攻略
  • 奇怪的“bug”--数据库的“隐式转换”行为
  • Kafka如何保证消费确认与顺序消费?
  • Torch -- 卷积学习day4 -- 完整项目流程
  • python numpy.random的基础教程(附opencv 图片转数组、数组转图片)
  • 3D max制作蝴蝶结详细步骤(新手可跟)♥️
  • 制造业原料仓储混乱?WMS 系统实现物料精准溯源,生产更顺畅_
  • 深度剖析Lua Table的运作方式
  • 透传 Attributes(详细解析)1
  • 服务器内存使用buff/cache的原理
  • Linux-----《Linux系统管理速通:界面切换、远程连接、目录权限与用户管理一网打尽》
  • 以AI技术为核心的变电设备声纹监测装置及方案特色解析
  • AI时代下阿里云基础设施的稳定性架构揭秘
  • 初试Docker Desktop工具
  • 服务器硬件电路设计之 SPI 问答(二):SPI 与 I2C 的特性博弈及多从机设计之道
  • Java ReentrantLock 核心用法
  • 算法提升树形数据结构-(线段树)
  • RAG拓展、变体、增强版(二)
  • Django管理后台结合剪映实现课件视频生成应用
  • SpringBoot+Vue打造动漫活动预约系统----后端
  • BM25 系列检索算法
  • Python Day32 JavaScript 数组与对象核心知识点整理
  • 用 Go 库 urfave/cli 轻松构建命令行程序
  • Linux上安装多个JDK版本,需要配置环境变量吗
  • STM32存储结构
  • Vue3 结合 html2canvas 生成图片