配置redisTemplate序列化,解决乱码与反序列化失败

打印 上一主题 下一主题

主题 941|帖子 941|积分 2823

  1. /**
  2. * @projectName: MultiModuleDemo
  3. * @package: com.example.config
  4. * @className: RedisConfig
  5. * @description: TODO(配置RedisTemplate序列化)
  6. * @date: 2023/12/18 21:08
  7. * @version: 1.0
  8. */
  9. @Configuration
  10. public class RedisConfig {
  11.     @Bean
  12.     public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory){
  13.         RedisTemplate<Object, Object> redis = new RedisTemplate<>();
  14.         redis.setConnectionFactory(factory);
  15.         redis.setKeySerializer(new StringRedisSerializer());
  16. //        redis.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
  17.         //解决转换异常问题  java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to LoginUser
  18.         redis.setValueSerializer(valueSerializer());
  19.         redis.afterPropertiesSet();
  20.         return redis;
  21.     }
  22.     /**
  23.      * @return RedisSerializer<Object>
  24.      * @author ccx
  25.      * @description TODO 解决查询缓存转换异常的问题,设置这个在反序列化时就不会报错
  26.      *  redis在存储进行序列化时,会将类中所有具有返回值的方法进行序列化
  27.      *  但是在读取进行反序列化时是根据set方法实现的,所以在类中当有非set方法有返回值是反序列化就会出错
  28.      *  这个问题是在反序列化LoginUser类时发现的,在JwtTokenFilter过滤器从redis读取用户时
  29.      *  因为LoginUser类实现了UserDetail,重写了一些isXXX方法,这些方法具有boolean返回值,但没有set方法,所以在序列化时会把值写进去,但反序列化时因为没有set方法又不能正常反序列化所以报错了
  30.      * @date 2024/1/3 23:23
  31.      */
  32.     private RedisSerializer<Object> valueSerializer(){
  33.         Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
  34.         ObjectMapper objectMapper = new ObjectMapper();
  35.         //setVisibility用于设置序列化和反序列化时的访问级别
  36.             //JsonAutoDetect.Visibility.ANY:any表示任务可见属性都将被序列化和反序列化;还有PUBLIC_ONLY:只有public属性将被序列化和反序列化;等等
  37.         objectMapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
  38.         //序列化时会带上类全名,这样在反序列化时就能成功了,现在enableDefaultTyping方法弃用了,应该换成activateDefaultTyping
  39. //        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  40.         objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
  41.         //反序列化时,遇到未知属性会不会报错,true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错
  42.         objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  43.         serializer.setObjectMapper(objectMapper);
  44.         return serializer;
  45.     }
  46. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表