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即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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); } |