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

相关推荐
zzzll11117 分钟前
Spring Boot 入门指南:从零开始构建微服务
spring boot·后端·微服务
运维行者_27 分钟前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php
用户31268748772031 分钟前
你的定时任务真的靠谱吗?Spring Boot @Scheduled 全链路拆解
spring boot
长栎34 分钟前
你用了五年的消息队列,不知道它背后站着中介者模式
后端
Gopher_HBo34 分钟前
路由注册:RouterGroup(routergroup.go)
后端
用户6081865279038 分钟前
Avalonia UI 控件样式定义的三种方式详解
后端
feng尘39 分钟前
volatile 可见性与内存屏障知识点
后端
SamDeepThinking41 分钟前
第3篇:企业级CAS单点登录实战-技术架构设计方案
后端·程序员·架构
JoyT43 分钟前
Agent 开源项目全景解析(上):LangGraph、Spring AI 与 Agent Runtime
后端
云技纵横44 分钟前
线上接口突然超时,怎么判断卡在 Nginx、线程池、连接池还是 SQL?
后端·sql·mysql