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

SpringBoot-Starter2.7.3自动装配Redisson升级版本运行时的问题

序言

在github上搜索redisson官方源码中的issue其他伙伴们提交的记录。

https://github.com/spring-projects/spring-data-redis/tree/main/src/main/java/org/springframework/data/redis/connection/zset

基础工程的pom文件中的依赖结构

springboot version

<dependency>
    <groupld>org.springframework.boot</groupld>
    <artifactld>spring-boot-starter</artifactld>
    <version>2.7.13</version>
    <scope>compile</scope>
</dependency>

redis version 继承了 springboot version

<dependency>
    <groupld>org.springframework.boot</groupld>
    <artifactld>spring-boot-starter-data-redis</artifactld>
</dependency>

mvn clean -->  mvn verify/package/install  对maven工程进行打包操作

spring.profile.active=环境名 (dev、test、druid等) 指定特定环境的application.yml配置文件启动升级版本后的错误在上面的issue中描述的现象。

在导入redisson-spring-boot-starter3.22.0版本项目启动过程中throws this exception

│ 2023-08-09 15:32:04.819 ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed                                                                                                                                    │
│                                                                                                                                                                                                                                                            │
│ org.springframework.context.ApplicationContextException: Failed to start bean 'redisPubsubContainer'; nested exception is java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple                                             │
│     at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.28.jar:5.3.28]                                                                                                       │
│     at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.28.jar:5.3.28]                                                                                                     │
│     at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.28.jar:5.3.28]                                                                                          │
│     at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]                                                                                                                                                                                     │
│     at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.28.jar:5.3.28]                                                                                                    │
│     at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.28.jar:5.3.28]                                                                                                     │
│     at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:937) ~[spring-context-5.3.28.jar:5.3.28]                                                                                               │
│     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.28.jar:5.3.28]                                                                                                     │
│     at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.13.jar:2.7.13]                                                                               │
│     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.13.jar:2.7.13]                                                                                                                                     │
│     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.13.jar:2.7.13]                                                                                                                              │
│     at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.13.jar:2.7.13]                                                                                                                                         │
│     at io.tolgee.Application$Companion.main(Application.kt:52) ~[app/:na]                                                                                                                                                                                  │
│     at io.tolgee.Application.main(Application.kt) ~[app/:na]                                                                                                                                                                                               │
│ Caused by: java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple                                                                                                                                                            │
│     at org.redisson.spring.data.connection.RedissonConnection.<clinit>(RedissonConnection.java:2361) ~[redisson-spring-data-31-3.23.2.jar:3.23.2]                                                                                                          │
│     at org.redisson.spring.data.connection.RedissonConnectionFactory.getConnection(RedissonConnectionFactory.java:113) ~[redisson-spring-data-31-3.23.2.jar:3.23.2]                                                                                        │
│     at org.springframework.data.redis.listener.RedisMessageListenerContainer$Subscriber.initialize(RedisMessageListenerContainer.java:1186) ~[spring-data-redis-2.7.13.jar:2.7.13]                                                                         │
│     at org.springframework.data.redis.listener.RedisMessageListenerContainer.doSubscribe(RedisMessageListenerContainer.java:318) ~[spring-data-redis-2.7.13.jar:2.7.13]                                                                                    │
│     at org.springframework.data.redis.listener.RedisMessageListenerContainer.lazyListen(RedisMessageListenerContainer.java:295) ~[spring-data-redis-2.7.13.jar:2.7.13]                                                                                     │
│     at org.springframework.data.redis.listener.RedisMessageListenerContainer.lazyListen(RedisMessageListenerContainer.java:265) ~[spring-data-redis-2.7.13.jar:2.7.13]                                                                                     │
│     at org.springframework.data.redis.listener.RedisMessageListenerContainer.start(RedisMessageListenerContainer.java:249) ~[spring-data-redis-2.7.13.jar:2.7.13]                                                                                          │
│     at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.28.jar:5.3.28]                                                                                                       │
│     ... 13 common frames omitted                                                                                                                                                                                                                           │
│ Caused by: java.lang.ClassNotFoundException: org.springframework.data.redis.connection.zset.Tuple                                                                                                                                                          │
│     at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602) ~[na:na]                                                                                                                                                    │
│     at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]                                                                                                                                                 │
│     at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]                                                                                                                                                                            │
│     ... 21 common frames omitted

分析过程

1、redisson-spring-boot-starter1.18.0升级方案

SpringBoot Version

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.7.3</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

redis-boot-starter version

<dependency>
    <groupld>org.springframework.boot</groupld>
    <artifactld>spring-boot-starter-data-redis</artifactld>
</dependency>

redisson-spring-boot-starter version

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.18.0</version>
</dependency>

这种 redisson-spring-boot-starter3.18.0发布到服务器上部署时进行漏洞扫描组件时发现因为版本号低了无法通过漏洞扫描检测,要求至少要达到redisson-spring-boot-starter3.22.0版本号。

springboot2.x在装配redisson兼容的最高版本3.18.0。在3.18.0以后版本编译过程就会出错。

2、redisson3.22.0

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.22.0</version>
</dependency>

导入redisson、redis-spring-boot-starter、spring-boot-starter依赖编译打包后运行maven主启动类后报错:

Caused by: org.springframcwork.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.redisson.api.RedissonClient" available: eq
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNMatchingBean

解决方案

3、在redisson-spring-boot-starter3.22.0依赖中redisson-spring-data 是 redisson-spring-data-31子依赖不能兼容spring-boot-starter-parent2.7.3版本,需要排除 redisson-spring-data-31,引入 redisson-spring-data-27依赖。

pom文件中升级依赖的版本

<dependency>
    <groupld>org.redisson</groupld>
    <artifactld>redisson-spring-boot-starter</artifactid>
    <version>3.22.0</version>
<exclusions>
    <exclusion>
        <groupld>org.redisson</groupld>
        <artifactld>redisson-spring-data-31</artifactid>
    </exclusion>
</exclusions>
</dependency>
<dependency>
    <groupld>org.redisson</groupld>
    <artifactld>redisson-spring-data-27</artifactld>
    <version>3.22.0</version>
</dependency>

第三种方式符合代码在服务器上部署时漏洞扫描组件要求依赖版本号至少要达到预期的版本。

小结

通过redisson-spring-boot升级3.22.0版本组件扫描是一种漏洞扫描。漏洞扫描是一种自动化的安全测试方法,用于检测计算机系统、网络和应用程序中的漏洞和安全缺陷。漏洞扫描工具会对系统进行自动化的测试,以发现可能存在的安全漏洞和缺陷,如密码弱、SQL注入、跨站脚本攻击等。漏洞扫描工具会模拟攻击者的攻击行为,对系统中的漏洞进行探测和测试,以帮助管理员或开发人员识别和修复系统中的漏洞。

代码漏洞扫描过程中发现redisson-spring-boot-starter低版本漏洞。

漏洞扫描的目的:

发现安全漏洞和缺陷

漏洞扫描可以帮助企业或组织发现其系统、网络或应用程序中可能存在的安全漏洞和缺陷,如密码弱、SQL注入、跨站脚本攻击等。

评估安全风险

漏洞扫描可以帮助企业或组织评估其系统、网络或应用程序的安全风险,以便采取相应的安全措施和调整安全策略。

提高安全性和可靠性

及时修复漏洞和缺陷可以提高系统的安全性和可靠性,防止安全事故和数据泄露等不良后果。

遵守法规和标准

许多法规和标准要求企业或组织对其系统、网络或应用程序进行安全测试和评估,漏洞扫描可以帮助企业或组织遵守相关法规和标准的要求。

参考附录

[1] https://blog.csdn.net/weixin_42555971/article/details/136732270 [N]

[2] https://www.ithere.net/article/1663178340985024513 [N]

[3] https://github.com/redisson/redisson [S]

[4] https://cloud.tencent.com/developer/techpedia/1773 [N]


http://www.kler.cn/news/321714.html

相关文章:

  • 自动驾驶技术:人工智能驾驶的未来
  • tauri程序加载本地图片或者文件在前端页面展示
  • ModStartCMS v8.9.0 图片上传优化,富文本编辑器修复
  • Spring Boot 实战:使用观察者模式实现实时库存管理
  • localectl 命令:系统语言、键盘布局和区域设置
  • CORE 中间件、wwwroot
  • C++11中引入的thread
  • 正向科技|格雷母线定位系统的设备接线安装示范
  • 脚手架是什么?详细版+通俗易懂版!!!!!!
  • DNS与host文件
  • 职业技能大赛-自动化测试笔记(PageObject)分享-4
  • 如何将自定义支付网关与 WooCommerce Checkout 区块集成
  • HarmonyOS---权限和http/Axios网络请求
  • 处理 VA02修改行项目计划行(SCHEDULE LINES )报错:不可能确定一个消耗帐户
  • count(1)、count(*) 与 count(列名) 的区别
  • zabbix“专家坐诊”第257期问答
  • 19、网络安全合规复盘
  • C++ | Leetcode C++题解之第440题字典序的第K小数字
  • 【HDP】zookeeper未授权漏洞修复
  • C语言课程设计题目四:实验设备管理系统设计
  • Flutter鸿蒙化环境配置(windows)
  • 网站设计中安全方面都需要有哪些考虑
  • 【opencv】——为arm平台交叉编译
  • Apache Iceberg 数据类型参考表
  • URL中 / 作为字符串,而不是路径。
  • 19.1 使用k8s的sdk编写一个项目获取pod和node信息
  • 【毕业论文+源码】如何使用Spring Boot搭建一个简单的篮球论坛系统
  • 企业急于采用人工智能,忽视了安全强化
  • Linux云计算 |【第四阶段】NOSQL-DAY3
  • ubuntu 24搭建docker私有仓库