13_Spring Boot 3.5.8 + Redisson 3.45.1 导致 Sa-Token 登录 StackOverflowError

13_Spring Boot 3.5.8 + Redisson 3.45.1 导致 Sa-Token 登录 StackOverflowError

一、问题背景

项目环境:

text 复制代码
Spring Boot          3.5.8
Sa-Token             1.45.0
Redisson             3.45.1
Spring Data Redis    3.5.6

项目登录时:

java 复制代码
StpUtil.login(userId);

出现:

text 复制代码
java.lang.StackOverflowError

at org.springframework.data.redis.connection.DefaultedRedisConnection.pExpire

二、依赖关系分析

项目基于:

xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.8</version>
</parent>

Spring Boot 会统一管理 Spring 生态依赖版本。

项目引入:

xml 复制代码
<!-- Spring Data Redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

由于没有指定版本:

xml 复制代码
<version>

版本由 Spring Boot 依赖管理控制。

因此:

复制代码
spring-boot-starter-data-redis
        |
        |
        spring-data-redis:3.5.6

实际项目使用:

text 复制代码
Spring Data Redis 3.5.6

三、Redisson 依赖分析

项目同时引入:

xml 复制代码
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.45.1</version>
</dependency>

Redisson 会引入自己的 Spring Data Redis 适配模块:

依赖树:

复制代码
redisson-spring-boot-starter:3.45.1
        |
        |
        redisson-spring-data-34:3.45.1
        |
        |
        spring-data-redis

其中:

复制代码
redisson-spring-data-34

表示:

Redisson 针对 Spring Data Redis 3.4.x 的适配模块。


四、版本冲突

最终项目运行环境:

复制代码
Spring Boot 3.5.8
        |
        |
spring-boot-starter-data-redis
        |
        |
spring-data-redis:3.5.6


Redisson 3.45.1
        |
        |
redisson-spring-data-34
        |
        |
针对 Spring Data Redis 3.4.x

形成:

复制代码
Redisson Spring Data 适配版本
          3.4

        VS

实际 Spring Data Redis
          3.5.6

存在版本不匹配。


五、异常触发流程

登录:

java 复制代码
StpUtil.login(userId);

进入 Sa-Token:

复制代码
StpUtil.login()
        |
        |
createLoginSession()
        |
        |
session.updateMinTimeout()
        |
        |
SaTokenDaoForRedisTemplate.updateSessionTimeout()
        |
        |
StringRedisTemplate.expire()

最终调用:

java 复制代码
RedisTemplate.expire()

执行:

java 复制代码
connection.pExpire()

此时底层 RedisConnection:

复制代码
StringRedisTemplate
        |
        |
DefaultStringRedisConnection
        |
        |
RedissonConnection

由于 Redisson 适配版本与 Spring Data Redis 版本不一致,导致 RedisConnection 方法调用异常。

最终:

复制代码
pExpire()
    ↓
expire()
    ↓
pExpire()
    ↓
expire()
    ↓
...

形成递归。

最终:

复制代码
StackOverflowError

六、解决方案

升级 Redisson:

原:

xml 复制代码
<redisson.version>3.45.1</redisson.version>

升级:

xml 复制代码
<redisson.version>3.52.0</redisson.version>

升级后:

复制代码
Redisson 3.52.0
        |
        |
redisson-spring-data-35
        |
        |
Spring Data Redis 3.5.x

与 Spring Boot 3.5.8 匹配。

问题解决。


七、总结

本次问题的根因:

Spring Boot 3.5.8 默认管理 Spring Data Redis 3.5.6,而 Redisson 3.45.1 引入了针对 Spring Data Redis 3.4 的适配模块(redisson-spring-data-34),两者版本不匹配,导致 RedisConnection 方法调用异常,在 Sa-Token 更新 Session 过期时间时触发 StackOverflowError。

排查类似问题时:

  1. 查看 Spring Boot 版本管理的依赖:

    复制代码
    spring-boot-starter-data-redis
         ↓
    spring-data-redis
  2. 查看第三方 Redis 客户端适配模块:

    复制代码
    redisson-spring-data-xx
  3. 确认二者版本匹配。

相关推荐
行百里er10 小时前
Redis 完结篇——Redis 热点问题在 Spring Boot 项目中实战
redis·后端
高频因子挖掘机11 小时前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api
孟健11 小时前
从5000亿Token到83%字节匹配:AI逆向工程与重构的工程闭环实践
后端·架构·ai编程
paopaokaka_luck12 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
SL_staff12 小时前
JVS混合架构实践:能力引擎+动态模型如何支撑企业级可持续交付
spring boot·低代码·全栈
码事漫谈12 小时前
丢得静悄悄,谈一谈 Agent 的记忆是怎么没的
后端
迪飞特科技12 小时前
智慧物业平台实战:Spring Boot 整合小程序实现报修巡检费用全流程
spring boot·后端·小程序
考虑考虑12 小时前
@JsonInclude注解使用
spring boot·后端·spring
IT_陈寒13 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端
网易云信13 小时前
大模型能上岗做销售吗?我们让 12 款国产模型交了 420 份作业
前端·后端