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

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.xdnf.cn/news/18230.html

相关文章:

  • PostgreSQL 中的金钱计算处理
  • SpringBoot 整合 Langchain4j RAG 技术深度使用解析
  • [论文阅读] 人工智能 + 软件工程 | 从用户需求到产品迭代:特征请求研究的全景解析
  • 微美全息(NASDAQ:WIMI):以区块链+云计算混合架构,引领数据交易营销科技新潮流
  • STM32学习笔记16-SPI硬件控制
  • 力扣48:旋转矩阵
  • RAG拓展、变体、增强版(二)
  • redis执行lua脚本的原子性和数据库原子性的区别
  • C++STL-list 底层实现
  • GSPO:Towards scalable reinforcement learning for language models
  • Web 安全之延迟攻击(Delay Attack)详解
  • 从基础到本质:文件 IO 操作全解析
  • 【Linux仓库】进程等待【进程·捌】
  • vc++调试总结
  • E10 通过RPC实现账号批量锁定与解锁
  • 管理项目服务器连接数据库
  • 【语法】markdown非常用场景
  • 交叉编译.so到鸿蒙使用
  • ansible playbook 实战案例roles | 实现基于node_exporter的节点部署
  • AV1视频编码器2024-2025技术进展与行业应用分析
  • scikit-learn/sklearn学习|变量去中心化和标准化
  • 【iOS】NSRunLoop
  • PyCharm2025无法启动Powershell.exe的解决办法
  • Google Chrome 扩展不受信任 - 不受支持的清单版本 解决方案
  • 苹果XR芯片介绍
  • 【GPT入门】第51课 将hf模型转换为GGUF
  • MyBatis--缓存详解
  • ACE - 阿里开源的一站式AI图像生成和编辑模型
  • C++排序算法学习笔记
  • 【数据结构】用堆解决TOPK问题