• 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);
    
    
        }
    

      

  • 相关阅读:
    从零开始写一个Tomcat(贰)--建立动态服务器
    从零开始写一个Tomcat(壹)
    struts2,hibernate,spring整合笔记(4)--struts与spring的整合
    struts2,hibernate,spring整合笔记(3)
    struts2,hibernate,spring整合笔记(2)
    struts2,hibernate,spring整合笔记(1)
    ANSYS018.1案例 三维冷热水混合器流体仿真
    详细分析小米抢购软件的实现步骤
    12306改版之后简单抢票软件的实现(二)完结
    12306改版之后简单抢票软件的实现
  • 原文地址:https://www.cnblogs.com/cndou/p/11662329.html
Copyright © 2020-2023  润新知