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
相关产品推荐
相关产品推荐

