Spring Boot 3迁移后Session事件不触发及Redis索引缺失求助
解决方案
1. 删除自定义的RedisIndexedSessionRepository Bean
移除你在UssmConfig中定义的以下代码(包括@Primary注解):
@Bean @Primary public RedisIndexedSessionRepository redisIndexedSessionRepository(RedisTemplate<String, Object> redisTemplate) { return new RedisIndexedSessionRepository(redisTemplate); }
Spring Boot 3 搭配 Spring Session 3.x 会自动通过RedisHttpSessionConfiguration创建RedisIndexedSessionRepository Bean(名为sessionRepository),手动定义会覆盖自动配置的核心逻辑,导致事件监听、索引维护等功能失效。
2. 确认依赖配置正确
确保项目引入了完整的Redis会话依赖:
Maven 配置
<dependencies> <!-- Spring Boot Redis Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Spring Session Redis --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> </dependencies>
Gradle 配置
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.session:spring-session-data-redis' }
3. 检查Spring Session配置
在application.yml或application.properties中确认Redis会话配置正确:
application.yml
spring: session: store-type: redis # 指定用Redis存储会话 redis: namespace: spring:session # 自定义Redis命名空间 flush-mode: on_save # 会话刷新模式 cleanup-cron: 0 * * * * ? # 过期会话清理定时任务(默认已配置)
application.properties
spring.session.store-type=redis spring.session.redis.namespace=spring:session spring.session.redis.flush-mode=on_save spring.session.redis.cleanup-cron=0 * * * * ?
4. 排查自动配置阻断情况
如果之前出现Consider defining a bean...错误,检查是否存在以下情况:
- 项目是否通过
@SpringBootApplication(exclude = RedisHttpSessionConfiguration.class)排除了Spring Session自动配置,若有则移除该排除项。 - 是否自定义了
RedisTemplate但泛型不匹配?RedisHttpSessionConfiguration需要注入RedisTemplate<String, Object>,如果自定义了模板,确保泛型符合要求,或通过@Qualifier指定正确的Bean。
5. 验证功能恢复
启动应用后执行以下验证:
- 登录创建会话,检查Redis中是否生成
{namespace}:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME索引键。 - 等待会话过期(或手动删除Redis会话键),通过事件监听器验证
SessionExpiredEvent和SessionDeletedEvent是否触发:
@Component public class SessionEventListener { @EventListener public void onSessionExpired(SessionExpiredEvent event) { System.out.println("会话过期:" + event.getSessionId()); } @EventListener public void onSessionDeleted(SessionDeletedEvent event) { System.out.println("会话删除:" + event.getSessionId()); } }
内容的提问来源于stack exchange,提问作者Subin Chalil
相关产品推荐
相关产品推荐

