SpringBoot项目使用CXF框架开发Soap通信接口

news2024/11/6 21:40:57

SpringBoot项目使用CXF框架开发Soap通信接口

物料准备:

1.引入cxf官方提供的SpringBootStarter依赖

2.定义需要暴雷给外部调用的java接口以及接口的实现类

3.配置CxfConfig类,把你定义的java接口注册为webservice的Endpoint

引入cxf-spring-boot-starter-jaxws依赖

这里因为我用的springboot版本是2.4.2的,所以这里选择引入的是3.2.4版本的cxf框架,不建议引入更高的版本。

<!-- CXF webservice -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.2.4</version>
        </dependency>

定义需要暴雷给外部调用的java接口以及接口的实现类

接口类

package cn.ath.knowwikibackend.cxf;


import cn.ath.knowwikibackend.cxf.bean.UserInfo;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import java.util.List;
//声明这个接口是一个WebService接口,必须指定targetNamespace命名空间
@WebService(targetNamespace = "http://cxf.knowwikibackend.ath.cn/")
public interface UserService {
    //WebMethod注解配置的是接口的方法名
    //如果方法有参数,必须配置WebParam注解里的name参数名和targetNamespace命名空间
    @WebMethod(operationName = "getHello")
    String getHello(@WebParam(name = "name",targetNamespace = "http://cxf.knowwikibackend.ath.cn/") String name);

    @WebMethod(operationName = "get123")
    List<String> get123();

    @WebMethod(operationName = "getUserInfo")
    UserInfo getUserInfo();

    @WebMethod(operationName = "getUserList")
    List<UserInfo> getUserList();

    @WebMethod(operationName = "execTest1")
    void execTest1();

    @WebMethod(operationName = "execTest2")
    void execTest2(@WebParam(name = "action",targetNamespace = "http://cxf.knowwikibackend.ath.cn/") String action);
    
}

实现类

package cn.ath.knowwikibackend.cxf;

import cn.ath.knowwikibackend.cxf.bean.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class UserServiceImpl implements UserService{
    @Override
    public String getHello(String name) {
        return "hello "+name;
    }

    @Override
    public List<String> get123() {
        List<String> aee = new ArrayList<>();
        aee.add("wer21r");
        aee.add("regft23tf");
        aee.add("retg23t");
        return aee;
    }

    @Override
    public UserInfo getUserInfo() {
        UserInfo userInfo = new UserInfo();
        userInfo.setAge(24);
        userInfo.setName("tear23ewr");
        userInfo.setUid(10003L);
        return userInfo;
    }

    @Override
    public List<UserInfo> getUserList() {
        List<UserInfo> list = new ArrayList<>();

        UserInfo userInfo = new UserInfo();
        userInfo.setAge(24);
        userInfo.setName("tear23ewr");
        userInfo.setUid(10003L);
        list.add(userInfo);

        UserInfo user2 = new UserInfo();
        user2.setAge(27);
        user2.setName("grfw34tgf");
        user2.setUid(10002L);
        list.add(user2);

        return list;
    }

    @Override
    public void execTest1() {
        log.info("execTest1 is exec ok !");
    }

    @Override
    public void execTest2(String action) {
        log.info("action:{} is exec ok !",action);
    }
}

配置CxfConfig类

package cn.ath.knowwikibackend.cxf;

import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;

@Configuration
public class CxfConfig {
    @Autowired
    private Bus bus;
    @Autowired
    private UserService userService;

    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        return new ServletRegistrationBean(
                new CXFServlet(),
                "/soap/*"
        );
    }
    
    @Bean
    public Endpoint userEndpoint(){
        EndpointImpl endpoint = new EndpointImpl(bus,userService);
        endpoint.publish("/user");
        return endpoint;
    }
}

测试访问webService效果

浏览器访问暴露出的soap接口

查看你的springboot项目暴露出的soap 接口清单,可以用浏览器访问

http://ip:port/webContext/soap/

webContext是你的项目的 server.servlet.context-path

/soap/ 是你在CxfConfig里配置的soap 接口的前缀

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

直接用浏览器访问

http://ip:port/webContext/soap/user?wsdl

也可以看到 user端点(Endpoint)的wsdl信息,如上图所示。

这个URL里的/user 是你在CxfConfig里配置的soap接口的Endpoint端点

使用hutool里提供的SoapClient调用这些soap接口

import cn.hutool.core.lang.Console;
import cn.hutool.http.webservice.SoapClient;   

@Test
    void test23607(){
        SoapClient client1 = SoapClient.create("http://localhost:8080/kwb/soap/user?wsdl");

        // soap xml请求报文 --- 请求 getHello方法
        Console.log(client1.setMethod("web:getHello","http://cxf.knowwikibackend.ath.cn/")
                .setParam("name","zhangsan")
                .getMsgStr(true));
        //soap  xml响应报文
        Console.log(client1.send(true));


        //重置 SoapClient
        client1.reset();

        // soap xml请求报文 --- 请求 get123方法
        Console.log(client1.setMethod("web:get123","http://cxf.knowwikibackend.ath.cn/")
                .getMsgStr(true));
        //soap  xml响应报文
        Console.log(client1.send(true));

        //重置 SoapClient
        client1.reset();
        Console.log(client1.setMethod("web:getUserInfo","http://cxf.knowwikibackend.ath.cn/")
                .getMsgStr(true));
        Console.log(client1.send(true));


        client1.reset();
        Console.log(client1.setMethod("web:getUserList","http://cxf.knowwikibackend.ath.cn/")
                .getMsgStr(true));
        Console.log(client1.send(true));

        client1.reset();
        Console.log(client1.setMethod("web:execTest1","http://cxf.knowwikibackend.ath.cn/")
                .getMsgStr(true));
        Console.log(client1.send(true));
    }

soap接口通信的xml日志如下

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <web:getHello xmlns:web="http://cxf.knowwikibackend.ath.cn/">
      <web:name>zhangsan</web:name>
    </web:getHello>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns2:getHelloResponse xmlns:ns2="http://cxf.knowwikibackend.ath.cn/">
      <return>hello zhangsan</return>
    </ns2:getHelloResponse>
  </soap:Body>
</soap:Envelope>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <web:get123 xmlns:web="http://cxf.knowwikibackend.ath.cn/"/>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns2:get123Response xmlns:ns2="http://cxf.knowwikibackend.ath.cn/">
      <return>wer21r</return>
      <return>regft23tf</return>
      <return>retg23t</return>
    </ns2:get123Response>
  </soap:Body>
</soap:Envelope>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <web:getUserInfo xmlns:web="http://cxf.knowwikibackend.ath.cn/"/>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns2:getUserInfoResponse xmlns:ns2="http://cxf.knowwikibackend.ath.cn/">
      <return>
        <age>24</age>
        <name>tear23ewr</name>
        <uid>10003</uid>
      </return>
    </ns2:getUserInfoResponse>
  </soap:Body>
</soap:Envelope>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <web:getUserList xmlns:web="http://cxf.knowwikibackend.ath.cn/"/>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns2:getUserListResponse xmlns:ns2="http://cxf.knowwikibackend.ath.cn/">
      <return>
        <age>24</age>
        <name>tear23ewr</name>
        <uid>10003</uid>
      </return>
      <return>
        <age>27</age>
        <name>grfw34tgf</name>
        <uid>10002</uid>
      </return>
    </ns2:getUserListResponse>
  </soap:Body>
</soap:Envelope>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <web:execTest1 xmlns:web="http://cxf.knowwikibackend.ath.cn/"/>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns2:execTest1Response xmlns:ns2="http://cxf.knowwikibackend.ath.cn/"/>
  </soap:Body>
</soap:Envelope>

使用Postman测试工具来测试soap接口

在这里插入图片描述

使用cxf自带的工具请求webservice接口

    @Test
    void test232323(){
        String address = "http://localhost:8080/kwb/soap/user?wsdl";
        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
        jaxWsProxyFactoryBean.setAddress(address);
        jaxWsProxyFactoryBean.setServiceClass(UserService.class);
        UserService userService = (UserService) jaxWsProxyFactoryBean.create();
        String name = "lisi";
        String res =  userService.getHello(name);
        System.err.println(res);

        List<UserInfo> userList = userService.getUserList();
        System.err.println(userList);

        userService.execTest1();
        userService.execTest2("bak-sql");
    }

执行效果如下

消费者端打印日志
hello lisi
[UserInfo(uid=10003, name=tear23ewr, age=24), UserInfo(uid=10002, name=grfw34tgf, age=27)]

//生产者端打印日志
2023-06-07 19:53:21,038  INFO [http-nio-8080-exec-1] [] c.a.k.c.UserServiceImpl [UserServiceImpl.java : 14] getHello--req name:lisi

2023-06-07 19:53:21,182  INFO [http-nio-8080-exec-2] [] c.a.k.c.UserServiceImpl [UserServiceImpl.java : 39] 访问了getUserList方法

2023-06-07 19:54:01,253  INFO [http-nio-8080-exec-4] [] c.a.k.c.UserServiceImpl [UserServiceImpl.java : 57] execTest1 is exec ok !

2023-06-07 19:54:01,264  INFO [http-nio-8080-exec-5] [] c.a.k.c.UserServiceImpl [UserServiceImpl.java : 63] action:bak-sql is exec ok !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Solidwoks PDM Add-ins (C#) 创建菜单命令

演示如何创建 C# Add-ins :将菜单命令添加到库视图的上下文相关菜单的。 注意&#xff1a;由于 SOLIDWORKS PDM Professional 无法强制重新加载add-ins&#xff0c;因此必须重新启动所有客户端计算机以确保使用最新版本的add-ins。 启动VS。新建项目&#xff0c;选择类库。在“…

数据结构——队列

数据结构——队列 文章目录 数据结构——队列前言队列基本概念队列的基本操作队列的顺序存储结构创建顺序队列代码入队操作代码出队操作代码顺序队列的关键语句 队列的链式存储结构链式队列初始化链式队列判断空链式队列的入队操作链式队列的出队操作 循环队列循环队列基本思想…

「Tech初见」Linux驱动之chrdev

目录 免责声明I. MotivationII. SolutionS1 - 主次设备号S2 - 设备驱动程序S3 - 字符设备驱动程序 III. Result 免责声明 「Tech初见」系列的文章&#xff0c;是本人第一次接触的话题 对所谓真理的理解暂时可能还不到位&#xff0c;避免不了会出现令人嗤鼻的谬论 所以&#…

Oracle中改变表的Owner和tablespace

初用Oracle&#xff0c;很多的不熟悉&#xff0c;建完库&#xff0c;没有建用户&#xff0c;也没创建表空间&#xff0c;就直接system用户建表添加数据&#xff0c;几个月过去&#xff0c;表建了近百个&#xff0c;数据添加了几万条&#xff0c;才越来越觉得这种方式缺点太多&a…

docker对cpu资源做限制

系列文章目录 文章目录 系列文章目录一、cgroup1.groups四大功能2.CPU 资源控制 二、1.限制可用的 swap 大小&#xff0c; --memory-swap2.对磁盘IO配额控制&#xff08;blkio&#xff09;的限制 总结 一、cgroup 1.groups四大功能 资源限制&#xff1a;可以对任务使用的资源…

华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

一、题目描述 相对开音节构成的结构为辅音元音&#xff08;aeiou&#xff09;辅音(r除外)e&#xff0c;常见的单词有life,time,woke,coke,joke,note,nose,communicate&#xff0c;use&#xff0c;gate&#xff0c;same&#xff0c;late等。 给定一个字符串&#xff0c;以空格…

递归算法在编程中的重要应用

递归算法在编程中的重要应用 引言一、引言1.1、什么是递归算法&#xff1f;1.2、递归算法的特点和优缺点 二、树和图的遍历2.1、深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;2.2、二叉树遍历、树的深度、节点个数等问题2.2.1、二叉树遍历…

关于对【oracle索引】的理解与简述

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131094864 出自【进步*于辰的博客】 无论使用的是oracle、mysql&#xff0c;亦或者其他数据库&a…

如何吃透一个Java项目?

现在Austin的文档我觉得还是比较全的&#xff0c;但到了看代码的时候&#xff0c;可能有的同学就不知道应该怎么看&#xff0c;有想知道模块之间的调用链路&#xff0c;有想一点一点把细节给全看了。这时候就很可能在项目里犯迷糊了&#xff0c;绕不出不来了。 Java开源项目消息…

MySQL的下载安装以及环境配置---图文教程

目录 一.下载 二.安装 三.设置环境变量 四.MySQL数据库的使用及注意事项 SQL语句注意事项 一.下载 1.打开 MySQL 数据库的网站。 2.往下滑 3.进入新的页面之后&#xff0c;点击 MySQL Installer for Windows 4.进入新的页面时&#xff0c;就可以下载MySQL数据库了&#x…

数据结构05:树的定义与双亲、孩子表示法[更新中]

参考用书&#xff1a;王道考研《2024年 数据结构考研复习指导》 参考用书配套视频&#xff1a;5.1.1 树的定义和基本术语_哔哩哔哩_bilibili 特别感谢&#xff1a; Chat GPT老师[部分名词解释、修改BUG]、BING老师[封面图]~ 备注&#xff1a;博文目前是未完成的状态&#xff…

Web安全:拿到 Web 服务器 最高权限.(vulntarget 靶场 A)

Web安全&#xff1a;拿到 Web 服务器 最高权限. Web 服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;可以处理浏览器等Web客户端的请求并返回相应响应&#xff0c;也可以放置网站文件&#xff0c;让全世界浏览&#xff1b;可以放置数据…

43 最佳实践-性能最佳实践-IOThread配置

文章目录 43 最佳实践-性能最佳实践-IOThread配置43.1 概述43.2 配置说明 43 最佳实践-性能最佳实践-IOThread配置 43.1 概述 KVM平台上&#xff0c;对虚拟磁盘的读写在后端默认由QEMU主线程负责处理。这样会造成如下问题&#xff1a; 虚拟机的I/O请求都由一个QEMU主线程进行…

基于springboot的数码论坛系统设计(Java、MySQL、B/S)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;数码论坛 获取源码源文件论文报告PPT 网络的广泛应用给生活带来了十分的便利。所以把数码论坛与现在网络相结合&#xff0c;利用java技术建设数码论坛系统&#xff0c;实现数码论坛的信息化。则对于进一步提高数码论坛发展…

Linux 下pause函数是如何实现的?

当你在程序中调用 pause() 函数时&#xff0c;它会使得你的程序停止执行&#xff0c;直到有一个信号被捕获。这是通过系统调用实现的。系统调用会使得程序从用户模式切换到内核模式。 这里是 pause() 函数的基本工作原理&#xff1a; 当你的程序调用 pause() 函数时&#xff…

python基础知识(十):类

目录 1. 类和方法的概念2. 类的定义3. 类的继承4. 重写父类的方法 1. 类和方法的概念 类&#xff1a;用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。举个例子&#xff0c;狗类就是狗的集合&#xff0c;每条狗都是狗…

kali学习笔记(二)

一、关闭自动锁屏 关闭自动锁屏对于测试人员来说&#xff0c;可以按照自己的习惯来设置&#xff0c;不然kali会过十分钟就锁屏&#xff0c;有的时候会比较不方便。 1、使用root账号登录&#xff0c;在display设置选项中做如下设置。 2、把休眠选项关掉。 二、创建快照 关机创…

透视Linux内核,BPF 深度分析与案例讲解

本次主要对BPF的部分原理、应用案例上进行一次分析记录。 BPF介绍 当内核触发事件时&#xff0c;BPF虚拟机能够运行相应的BPF程序指令&#xff0c;但是并不是意味着BPF程序能访问内核触发的所有事件。将BPF目标文件加载到BPF虚拟机时&#xff0c;需要确定特定的程序类型&…

SpringBoot中的定时任务@Scheduled的使用

1.Scheduled注解介绍 在spring boot的项目中需要使用到定时任务的时候&#xff0c;可以使用Scheduled注解&#xff0c;这只是在一个JVM进程中很适用&#xff0c;如果涉及到服务器是集群的情况下&#xff0c;建议使用任务调度平台。这样任务调度平台会在多台服务器中选择一台进…

【linux】在Ubuntu下部署nginx——nginx的安装与卸载

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…