Spring Boot2.7.16+Java21下RedisTokenStore存Token报WRONGTYPE异常
问题解决:Spring Boot升级后RedisTokenStore存储Token报WRONGTYPE异常
问题原因
这个异常本质是Redis中遗留了旧版本生成的Key,其数据类型与新版本Spring Security OAuth2的RedisTokenStore使用的类型不匹配,再加上版本升级带来的序列化方式、依赖兼容性变化,共同触发了错误:
- Spring Boot 1.5与2.7对应的Spring Security OAuth2版本中,RedisTokenStore的Key结构、存储数据类型发生了变化(比如旧版本将部分Key存为Hash,新版本改为String类型,反之亦然);
- 升级后未清理Redis中的旧Token数据,新代码尝试用新类型操作旧Key,触发Redis的WRONGTYPE校验错误;
- 手动引入Jedis依赖但未排除Spring Boot默认的Lettuce客户端,引发连接层兼容性冲突;
- Redis序列化方式变更(新版本默认序列化器与旧版本不一致),导致数据读写时类型不兼容。
解决方案
1. 清理Redis中旧的OAuth2相关数据
直接删除Redis中所有与OAuth2 Token相关的Key,比如以access:、refresh:、auth:、client:开头的Key:
# Redis CLI命令,批量删除相关Key redis-cli KEYS "access:*" | xargs redis-cli DEL redis-cli KEYS "refresh:*" | xargs redis-cli DEL redis-cli KEYS "auth:*" | xargs redis-cli DEL redis-cli KEYS "client:*" | xargs redis-cli DEL
生产环境执行前请确认数据可删除,或先做好备份。
2. 统一Redis序列化配置
RedisTokenStore默认使用JdkSerializationRedisSerializer,需确保RedisTemplate的序列化器与之匹配,避免类型不兼容。添加配置类:
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 配置与RedisTokenStore一致的JDK序列化器 JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(jdkSerializer); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jdkSerializer); template.afterPropertiesSet(); return template; } }
3. 修复Redis依赖冲突
Spring Boot 2.7的spring-boot-starter-data-redis默认依赖Lettuce,手动引入Jedis时需排除Lettuce,避免客户端冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.10.0</version> </dependency>
4. 确认RedisTokenStore的正确配置
确保RedisTokenStore通过RedisConnectionFactory正确创建并注入,避免自定义配置导致的异常:
@Bean public TokenStore tokenStore(RedisConnectionFactory redisConnectionFactory) { return new RedisTokenStore(redisConnectionFactory); } @Bean public DefaultTokenServices tokenServices(TokenStore tokenStore) { ThirdPartyTokenService services = new ThirdPartyTokenService(); services.setTokenStore(tokenStore); // 补充必要配置:支持刷新token、token有效期等 services.setSupportRefreshToken(true); services.setReuseRefreshToken(false); return services; }
验证步骤
- 重启应用后调用Token生成接口,确认不再抛出WRONGTYPE异常;
- 登录Redis CLI,用
TYPE access:xxx命令查看新生成的Token Key类型,确认与代码预期一致。
内容的提问来源于stack exchange,提问作者Sreejesh
相关产品推荐
相关产品推荐

