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

这篇具有很好参考价值的文章主要介绍了SpringBoot项目使用CXF框架开发Soap通信接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 接口的前缀

cxfconfig,SpringBoot技术笔记,JavaWeb笔记,spring boot,java,cxf,soap,webService

cxfconfig,SpringBoot技术笔记,JavaWeb笔记,spring boot,java,cxf,soap,webService

cxfconfig,SpringBoot技术笔记,JavaWeb笔记,spring boot,java,cxf,soap,webService

直接用浏览器访问

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接口

cxfconfig,SpringBoot技术笔记,JavaWeb笔记,spring boot,java,cxf,soap,webService

使用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");
    }

执行效果如下文章来源地址https://www.toymoban.com/news/detail-691521.html

消费者端打印日志
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 !

到了这里,关于SpringBoot项目使用CXF框架开发Soap通信接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • [webservice] springboot整合cxf

    2.1 pom.xml 中添加依赖 springboot整合Apache cxf 2.3 service发布(cxf配置) 发布完成后启动web服务,可以通过: http://127.0.0.1:8080/ws 访问已经发布的服务。 在这里分享一个天气预报的webservice服务: http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 3.1 使用wsdl2java生成webservice客户端代码

    2024年04月25日
    浏览(6)
  • 【开源】SpringBoot框架开发企业项目合同信息系统

    【开源】SpringBoot框架开发企业项目合同信息系统

    基于JAVA+Vue+SpringBoot+MySQL的企业项目合同信息系统,包含了合同审批模块、合同签订模块、合同预定模块和合同数据可视化模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,企业项目合同信息系统

    2024年02月20日
    浏览(17)
  • 【开发细节】SpringBoot项目将接口从HTTP换为HTTPS

    【开发细节】SpringBoot项目将接口从HTTP换为HTTPS

    首先需要生成一个 SSL 证书,可以使用 OpenSSL 工具或者自己的 CA 颁发机构来生成证书 ,这里就不赘述了。如果是 测试阶段,也可以使用 self-signed certificate 。 直接使用 jdk的keytool生成 ,具体操作方法如下: 使用管理员身份运行命令提示符 使用命令进入到jdk安装路径的bin文件

    2024年02月13日
    浏览(11)
  • 【项目源码】一套基于springboot+Uniapp框架开发的智慧医院3D人体导诊系统源码

    【项目源码】一套基于springboot+Uniapp框架开发的智慧医院3D人体导诊系统源码

    智慧医院3D人体导诊系统源码 开发语言:java 开发工具:IDEA 前端框架:Uniapp  后端框架:springboot   数 据 库:mysql  移 动 端:微信小程序、H5 “智慧导诊”以人工智能手段为依托,为人们提供智能分诊、问病信息等服务,在一定程度上满足了人们自我健康管理、精准挂号等

    2024年02月10日
    浏览(13)
  • 使用SpringBoot开发一个POST接口

    SpringBoot框架项目一般分为五层: View层:向用户展示页面 Controller层:前后端交互层,接收前端请求,调用Service层中的方法,接收Service层返回的数据并将其返回到前端。 Service层:存放业务处理的逻辑,以及一些操作数据库的接口 Mapper层:也可以成为DAO层,是数据库CRUD的接

    2024年02月08日
    浏览(6)
  • .NetCore调用Soap接口

    添加服务引用的方式无法满足我请求Soap接口,所以写了个Soap帮助类,使用HttpClient的方式请求接口。 提示:以下是本篇文章正文内容,下面案例可供参考 一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素: 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息 可选的

    2024年02月04日
    浏览(9)
  • Java 调用 WebService 、java调用Soap请求、Java对接soap接口

    工作第一次遇到对接soap接口,觉得有必要记录一下,毕竟踩了不少坑,网上帖子很多但大都不全,也不可能完全满足自己的需求,于是就有了下面的代码: 除了只是借鉴, 注意事项: 1.http://ip:port/xxx/xxx/soap?wsdl有些soap接口,对面是不需要穿?wsdl对接时要问出清 2. httpPost.set

    2024年02月05日
    浏览(9)
  • SpringBoot 项目使用 Redis 对用户 IP 进行接口限流

    SpringBoot 项目使用 Redis 对用户 IP 进行接口限流

    使用接口限流的主要目的在于提高系统的稳定性,防止接口被恶意打击(短时间内大量请求)。 比如要求某接口在1分钟内请求次数不超过1000次,那么应该如何设计代码呢? 下面讲两种思路,如果想看代码可直接翻到后面的代码部分。 1.1 固定时间段(旧思路) 1.1.1 思路描述

    2024年02月15日
    浏览(10)
  • SpringBoot 项目使用 Redis 对用户IP进行接口限流

    SpringBoot 项目使用 Redis 对用户IP进行接口限流

    本文主要参考了该篇文章:https://www.zhihu.com/question/586213782/answer/3038040317?utm_id=0 使用接口限流的主要目的在于提高系统的稳定性,防止接口被恶意打击(短时间内大量请求)。 比如要求 某接口 在 1分钟 内请求次数不超过 1000次 ,那么应该如何设计代码呢? 下面讲两种思路,

    2024年02月16日
    浏览(8)
  • 【security】java springboot项目中使用springSecurity安全框架

    springboot项目如果导入security依赖后会自动托管整个项目,前端在访问项目的任何路径时会被拦截并跳转到security默认的登录页面,登录用户名为user,密码为控制台启动项目时生成的随机密码 一、自定义设置用户的认证:创建一个配置类(类上加@Configuration),让该类继承Web

    2024年02月15日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包