
从 Spring Boot 2.7.1 升级到 2.7.5 (问题 2.7.2 开始), 项目用了 sa-token-dao-redis-jackson,jackson 序列化将对象中的 Long 由原本的
{ ... "accountId": [ "java.lang.Long", 25 ], ... } 改成了
... "accountId": 25, ... 数据存到 Redis 的升级之后不兼容,登录报错:
Could not read JSON: Cannot deserialize value of type `java.lang.Long` from Array value (token `JsonToken.START_ARRAY`) Redis 配置:
@Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setHashKeySerializer(stringRedisSerializer); Jackson2JsonRedisSerializer<?> jackson2JsOnRedisSerializer= new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); SimpleModule simpleModule = new SimpleModule(); objectMapper.registerModule(simpleModule); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; } 我想请教,升级版本后能否通过配置保持旧的序列化形式? 如果不行的话就只能清除缓存强行升级了,所有的用户登录状态会丢失,或者…… 停在 2.7.1 版本一直不升级。
1 zhouhu 2022 年 10 月 21 日 redis 历史数据没做兼容吧? |
2 ql562482472 2022 年 10 月 21 日 jackson 少了个配置把应该是 字段带属性那种序列化应该是要 objectmapper enable NON_FINAL 和 jsonTypeInfo.As.PROPERTY |
3 L0L 2022 年 10 月 21 日 感觉像是 jackson 可能多了一些默认配置?可以写个 demo 试一试? |
4 OldCarMan 2022 年 10 月 21 日 话说,为啥 "accountId": [ "java.lang.Long", 25 ] |