ToB企服应用市场:ToB评测及商务社交产业平台

标题: 配置redisTemplate序列化,解决乱码与反序列化失败 [打印本页]

作者: 鼠扑    时间: 2024-4-5 06:06
标题: 配置redisTemplate序列化,解决乱码与反序列化失败
  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. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4