• [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顶级项目。
    
    • 1
    • 2

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

    2.1 pom.xml 中添加依赖

    springboot整合Apache cxf

           <dependency>
                    <groupId>org.apache.cxfgroupId>
                    <artifactId>cxf-spring-boot-starter-jaxwsartifactId>
                    <version>3.5.7version>
                    <exclusions>
                        <exclusion>
                            <groupId>org.springframework.bootgroupId>
                            <artifactId>spring-boot-starter-loggingartifactId>
                        exclusion>
                    exclusions>
                dependency>
    
                <dependency>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-starter-web-servicesartifactId>
                    <version>2.3.12.RELEASEversion>
                    <exclusions>
                        <exclusion>
                            <groupId>com.sun.xml.bindgroupId>
                            <artifactId>jaxb-implartifactId>
                        exclusion>
                    exclusions>
                dependency>
    
    
                <dependency>
                    <groupId>org.dom4jgroupId>
                    <artifactId>dom4jartifactId>
                    <version>2.1.3version>
                dependency>
                
                <dependency>
                    <groupId>jaxengroupId>
                    <artifactId>jaxenartifactId>
                    <version>2.0.0version>
                dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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
         */
        @Bean
        public ServletRegistrationBean wsServletConfig() {
            return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
        }
    
        @Resource
        private MedicalOrderService medicalOrderService;
        // 对于多个发布的service,可以写多个bean来实现
        @Bean
        public Endpoint orderEndpoint() {
            return formatEndpoint("/medicalOrderService", medicalOrderService);
        }
    
    
        /**
         * 格式化暴漏的ws接口信息
         *
         * @param path  暴露的ws请求地址
         * @param svc   与地址对应的ws服务
         * @return
         */
        @Resource
        Bus bus;
    
        private Endpoint formatEndpoint(String path, Object svc) {
            EndpointImpl endpoint = new EndpointImpl(bus, svc);
            endpoint.publish(path);
            return endpoint;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    发布完成后启动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("临时测试使用")
        @Test
        public void test1() {
            MedicalOrderServiceService svc = new MedicalOrderServiceService();
            svc.getMedicalOrderSvcPort().medicationOrderRequest(message);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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
  • 相关阅读:
    第9章 Apache-Dbutils实现CRUD操作
    迅为龙芯2K1000核心板国产Linux工业板卡适用于工控电力能源行业方案
    原来 GitHub 不仅能学代码,还有这些东西
    图解算法数据结构——数据结构
    chatGLM2-6B模型LoRA微调数据集实现大模型的分类任务
    Vue 项目开发将数据下载到本地的方法
    cario库——C++画图
    Win11怎么关闭开机自启动软件
    .NET混合开发解决方案8 WinForm程序中通过设置固定版本运行时的BrowserExecutableFolder属性集成WebView2控件
    文字雨特效
  • 原文地址:https://blog.csdn.net/seven_zhao/article/details/134480603