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

Spring Session Redis序列化OAuth2AccessToken失败,配置是否缺失?

问题分析与解决方案

问题根源

你遇到的序列化异常核心原因是:OAuth2AccessTokenJackson2Serializer(Spring Security OAuth2自带的序列化器)不支持Jackson的类型ID(Type Id)处理逻辑,而你配置的GenericJackson2JsonRedisSerializer默认会在序列化对象时添加@class类型字段,两者冲突导致序列化失败。

解决方案

针对Spring Boot 1.5.x + Spring Session 1.3.x的环境,可通过以下方式修复:

方案一:调整ObjectMapper,禁用自动类型ID并注册OAuth2模块

修改objectMapper()方法,关闭默认类型信息添加逻辑,同时显式注册OAuth2相关Jackson模块:

private ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    // 禁用默认类型ID添加,避免与OAuth2序列化器冲突
    mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    // 注册Spring Security和OAuth2的Jackson序列化模块
    mapper.registerModule(new SecurityJackson2Module());
    mapper.registerModule(new OAuth2Jackson2Module());
    return mapper;
}

方案二:自定义RedisSerializer,单独处理OAuth2AccessToken

如果方案一无效,可自定义序列化器,对OAuth2AccessToken类型单独适配:

@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
    return new RedisSerializer<Object>() {
        private final GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(objectMapper());
        private final OAuth2AccessTokenJackson2Serializer oauth2Serializer = new OAuth2AccessTokenJackson2Serializer();
        private final ObjectMapper mapper = new ObjectMapper();

        @Override
        public byte[] serialize(Object o) throws SerializationException {
            if (o instanceof OAuth2AccessToken) {
                try {
                    return mapper.writeValueAsBytes(oauth2Serializer.serialize((OAuth2AccessToken) o));
                } catch (JsonProcessingException e) {
                    throw new SerializationException("Failed to serialize OAuth2AccessToken", e);
                }
            }
            return jsonSerializer.serialize(o);
        }

        @Override
        public Object deserialize(byte[] bytes) throws SerializationException {
            // 如需处理OAuth2AccessToken反序列化,可添加对应逻辑
            return jsonSerializer.deserialize(bytes);
        }
    };
}

临时快捷方案

如果OAuth2Employee中的accessToken字段不需要存入Redis,直接给该字段添加@JsonIgnore注解跳过序列化即可。

内容的提问来源于stack exchange,提问作者dev-rifaii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:40:24