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

[webservice] springboot整合cxf

1. cxf是什么

    Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。CXF,Apache CXF = Celtix +XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF,继承了 Celtix 和 XFire 两大开源项目的精华,提供了对JAX-WS全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。

2. springboot整合cxf的操作(server端发布)

2.1 pom.xml 中添加依赖

springboot整合Apache cxf

       <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.5.7</version><exclusions><!-- CXF uses java.util.logging by default --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId><version>2.3.12.RELEASE</version><exclusions><exclusion><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version></dependency><!-- dom4j解析xpath依赖 --><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>2.0.0</version></dependency>

2.2 编写server端

@Service
// 配置targetNamespace和服务名称
@WebService(targetNamespace = "ws.vh.com", name = "MedicalOrderSvc")
public class MedicalOrderService {// 配置service中的method@WebMethod(operationName = "medicationOrderRequest")@WebResult// 使用WebParam配置参数名称,不配置的话默认会是arg0之类的名称public R medicationOrderRequest(@WebParam(name = "message") String message) { return null;}
}

2.3 service发布(cxf配置)

@Configuration
@EnableWs
public class CxfConfig {/*** 注意:此方法被注释后WSDL访问地址是http://127.0.0.1:8080/services/helloService?wsdl* 放开注释后WSDL访问地址是:http://127.0.0.1:8080/ws/helloService?wsdl*/@Beanpublic ServletRegistrationBean wsServletConfig() {return new ServletRegistrationBean(new CXFServlet(), "/ws/*");}@Resourceprivate MedicalOrderService medicalOrderService;// 对于多个发布的service,可以写多个bean来实现@Beanpublic Endpoint orderEndpoint() {return formatEndpoint("/medicalOrderService", medicalOrderService);}/*** 格式化暴漏的ws接口信息** @param path  暴露的ws请求地址* @param svc   与地址对应的ws服务* @return*/@ResourceBus bus;private Endpoint formatEndpoint(String path, Object svc) {EndpointImpl endpoint = new EndpointImpl(bus, svc);endpoint.publish(path);return endpoint;}
}

发布完成后启动web服务,可以通过:http://127.0.0.1:8080/ws 访问已经发布的服务。
在这里分享一个天气预报的webservice服务:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

3. webservice使用(client端调用)

3.1 使用wsdl2java生成webservice客户端代码

将目录切换到下载的apache-cxf-版本文件包的bin目录下,然后执行如下命令wsdl2java -p com.vh -d /Users/johnny/Desktop/aa -client http://127.0.0.1:8083/ws/medicalOrderService?wsdl

  • -p:指定生成的Java代码的package
  • -d:指定生产的文件的根目录
  • -client 指定线上或本地的wsdl文件,用于生成客户端代码

3.2 使用

   @DisplayName("临时测试使用")@Testpublic void test1() {MedicalOrderServiceService svc = new MedicalOrderServiceService();svc.getMedicalOrderSvcPort().medicationOrderRequest(message);}

3.3 xpath说明

对于XML文档的读取来说,xpath几乎是通常的选择,而在使用webservice时通常伴随着对于XML文档的解析。
xpath常用规则(其它规则可以参考文档:https://blog.csdn.net/qq_44619675/article/details/113938171)

表达式描述
nodename选取此节点的所有子节点
/从根节点选取直接子节点(相当于绝对路径)
//从当前节点选择子节点(相当于相对路径)
.选取当前节点
选取当前节点的父节点
@选取属性
以上面天气预报为例使用dom4j+xpath读取第一个方法的描述
@Test@DisplayName("读取天气预报wsdl第一个方法的描述")public void test2() throws IOException, DocumentException {URL url = new URL("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl");URLConnection conn = url.openConnection();SAXReader saxReader = new SAXReader();Document doc = saxReader.read(conn.getInputStream());Node node = doc.selectSingleNode("/wsdl:definitions/wsdl:portType[@name=\"WeatherWebServiceSoap\"]/wsdl:operation[@name=\"getSupportCity\"]/wsdl:documentation");System.out.println(node.getText());}

4. 参考文档

  • https://cxf.apache.org/docs/index.html
  • https://baike.baidu.com/item/Web%20Service/1215039?fr=ge_ala
  • https://blog.csdn.net/qq_44619675/article/details/113938171

相关文章:

  • 点云从入门到精通技术详解100篇-基于点云数据的机器人装焊 过程在线测量
  • 若依框架数据源切换为pg库
  • vue的生命周期分别是什么?
  • 搭建成功simulink-stm32硬件在环开发环境
  • Ubuntu 22.04安装Rust编译环境并且测试
  • 网络运维与网络安全 学习笔记2023.11.18
  • MIUI解锁BL
  • YOLOv8优化与量化(1000+ FPS性能)
  • Kotlin语言实现单击任意TextVIew切换一个新页面,并且实现颜色变换
  • 基础组件-流量回放(全链路流量回放预研)
  • k8s-集群升级 2
  • 【OpenCV实现图像:OpenCV进行OCR字符分割】
  • C语言 原码、反码、补码
  • MySQL 定时计划任务 事件的使用
  • 蓝桥杯第三周算法竞赛D题E题
  • php的引用
  • [译] React v16.8: 含有Hooks的版本
  • CSS实用技巧
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iOS编译提示和导航提示
  • javascript面向对象之创建对象
  • laravel5.5 视图共享数据
  • markdown编辑器简评
  • maya建模与骨骼动画快速实现人工鱼
  • nodejs实现webservice问题总结
  • Python 基础起步 (十) 什么叫函数?
  • Ruby 2.x 源代码分析:扩展 概述
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Vue官网教程学习过程中值得记录的一些事情
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 分享几个不错的工具
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 你真的知道 == 和 equals 的区别吗?
  • 如何学习JavaEE,项目又该如何做?
  • 双管齐下,VMware的容器新战略
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 函数计算新功能-----支持C#函数
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • (06)Hive——正则表达式
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (九)c52学习之旅-定时器
  • (转)关于pipe()的详细解析
  • . Flume面试题
  • .net 4.0发布后不能正常显示图片问题
  • .Net 8.0 新的变化
  • .NET Core 2.1路线图
  • .net web项目 调用webService