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. 确认二者版本匹配。

相关推荐
码事漫谈13 分钟前
DeepSeek 搞了个 "Super-agent",但不是超级智能
后端
吴凡wudianmei18 分钟前
从 0 搭一个 AI Agent(四):SSE 跑通之后,三处“契约错配”与它们的修复边界
前端·后端·aigc
paopaokaka_luck27 分钟前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
小兔子32 分钟前
defer 的参数在写下那一刻就求值了,循环里这样写会踩坑
后端
苍何33 分钟前
腾讯 Buddy One 来了,办公生态一键打通 WorkBuddy(附教程)
后端
Tokenfree34 分钟前
把通义千问接进工单系统:三个版本够用,但有两个坑没人提前告诉我
后端
wei_shuo35 分钟前
MongoDB迁移实战:基于SQL的文档数据开发与多模态融合实践
后端
小兔子1 小时前
os.path.join 遇到绝对路径会丢掉前面所有段,这条规则写在文档第二句
后端
小兔子1 小时前
Go 的接口是类型加值,所以赋了 nil 的 err 判断起来不等于 nil
后端
不一样的少年_1 小时前
不花一分额外 API 钱,用现成的 Claude Code / Codex / Cursor 搭建 AI 个人知识库
前端·后端·ai编程