zoukankan      html  css  js  c++  java
  • Redis获取缓存异常:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX

    Redis获取缓存异常:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX。

    出现这种异常,我需要自定义ObjectMapper,设置一些参数,而不是直接使用Jackson2JsonRedisSerializer类中黙认的ObjectMapper,看源代码可以知道,Jackson2JsonRedisSerializer中的ObjectMapper是直接使用new ObjectMapper()创建的,这样ObjectMapper会将Redis中的字符串反序列化为java.util.LinkedHashMap类型,导致后续Spring对其进行转换成报错。其实我们只要它返回Object类型就可以了。

    使用以下方法,构建一个Jackson2JsonRedisSerializer对象,将其注入RedisCacheConfiguration即可。

     private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
            Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =
                    new Jackson2JsonRedisSerializer<>(Object.class);
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
            // 此项必须配置,否则会报java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX
            objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
            objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
            return jackson2JsonRedisSerializer;
        }
    
        @Bean
        public RedisCacheManager redisCacheManager(RedisConnectionFactory connectionFactory){
            //初始化一个RedisCacheWriter输出流
            RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
            //采用Jackson2JsonRedisSerializer序列化机制
    
    //        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
    
            //创建一个RedisSerializationContext.SerializationPair给定的适配器pair
            RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer());
            //创建CacheConfig
            RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);
    
            return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
    
    
        }
    

      

  • 相关阅读:
    Server2008 Enterprise SP2 is now installed
    “广” && “专”的抉择 个人技术发展之我见!
    从需求到UI的实现策略
    浙江行之杭州
    Windows 7 6956 安装过程感言
    为了生活选择了Microsoft,为了理想仰慕Google
    腾讯2009的一个小BUG,发现腾讯竟然也在用nginx
    生活GOOGLE,GOOGLE生活
    整理下自己电脑所用的软件下一步一步一步走做好该做的
    面试的一天二天
  • 原文地址:https://www.cnblogs.com/cndou/p/11662329.html
Copyright © 2011-2022 走看看