You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot2.7.16+Java21下RedisTokenStore存Token报WRONGTYPE异常

问题解决:Spring Boot升级后RedisTokenStore存储Token报WRONGTYPE异常

问题原因

这个异常本质是Redis中遗留了旧版本生成的Key,其数据类型与新版本Spring Security OAuth2的RedisTokenStore使用的类型不匹配,再加上版本升级带来的序列化方式、依赖兼容性变化,共同触发了错误:

  1. Spring Boot 1.5与2.7对应的Spring Security OAuth2版本中,RedisTokenStore的Key结构、存储数据类型发生了变化(比如旧版本将部分Key存为Hash,新版本改为String类型,反之亦然);
  2. 升级后未清理Redis中的旧Token数据,新代码尝试用新类型操作旧Key,触发Redis的WRONGTYPE校验错误;
  3. 手动引入Jedis依赖但未排除Spring Boot默认的Lettuce客户端,引发连接层兼容性冲突;
  4. 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;
}

验证步骤

  1. 重启应用后调用Token生成接口,确认不再抛出WRONGTYPE异常;
  2. 登录Redis CLI,用TYPE access:xxx命令查看新生成的Token Key类型,确认与代码预期一致。

内容的提问来源于stack exchange,提问作者Sreejesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:55:37