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一、问题背景项目环境Spring Boot 3.5.8 Sa-Token 1.45.0 Redisson 3.45.1 Spring Data Redis 3.5.6项目登录时StpUtil.login(userId);出现java.lang.StackOverflowError at org.springframework.data.redis.connection.DefaultedRedisConnection.pExpire二、依赖关系分析项目基于parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.5.8/version/parentSpring Boot 会统一管理 Spring 生态依赖版本。项目引入!-- Spring Data Redis --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency由于没有指定版本version版本由 Spring Boot 依赖管理控制。因此spring-boot-starter-data-redis | | spring-data-redis:3.5.6实际项目使用Spring Data Redis 3.5.6三、Redisson 依赖分析项目同时引入dependencygroupIdorg.redisson/groupIdartifactIdredisson-spring-boot-starter/artifactIdversion3.45.1/version/dependencyRedisson 会引入自己的 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存在版本不匹配。五、异常触发流程登录StpUtil.login(userId);进入 Sa-TokenStpUtil.login() | | createLoginSession() | | session.updateMinTimeout() | | SaTokenDaoForRedisTemplate.updateSessionTimeout() | | StringRedisTemplate.expire()最终调用RedisTemplate.expire()执行connection.pExpire()此时底层 RedisConnectionStringRedisTemplate | | DefaultStringRedisConnection | | RedissonConnection由于 Redisson 适配版本与 Spring Data Redis 版本不一致导致 RedisConnection 方法调用异常。最终pExpire() ↓ expire() ↓ pExpire() ↓ expire() ↓ ...形成递归。最终StackOverflowError六、解决方案升级 Redisson原redisson.version3.45.1/redisson.version升级redisson.version3.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。排查类似问题时查看 Spring Boot 版本管理的依赖spring-boot-starter-data-redis ↓ spring-data-redis查看第三方 Redis 客户端适配模块redisson-spring-data-xx确认二者版本匹配。

本月热点