java - Spring-data-redis @Cacheable java.lang.ClassCastException : java. util.LinkedHashMap 无法转换为 MyObject

标签 java redis spring-data

我正在使用 spring-data-redis 在我的 Spring Boot 应用程序中缓存数据。我使用 Mongo 作为主要数据源,使用 Redis 作为缓存。当我第一次使用该 API 时,它会从 Mongo 获取记录并将其保存在缓存中,并将 MyObject 正确返回给客户端。但是当我第二次访问 API 时,它在缓存中找到了该记录,并且在尝试将其反序列化回 MyObject 时,它.总是遇到强制转换异常:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MyObject

这是我的 Redis 配置:

public class MyConfiguration {
    @Bean
    public CacheManager cacheManager(RedisTemplate<String, MyObject> redisTemplate) {
        return new RedisCacheManager(redisTemplate);
    }

    @Bean
    public RedisTemplate<String, MyObject> redisTemplate(RedisConnectionFactory connectionFactory, ObjectMapper objectMapper) {
        StringRedisSerializer serializer = new StringRedisSerializer();
        GenericJackson2JsonRedisSerializer hashValueSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
        RedisTemplate<String, MyObject> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(serializer);
        redisTemplate.setValueSerializer(hashValueSerializer);
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }
}

发现此处报告的相同问题:Spring-data-redis @Cacheable java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.String

我研究了很长一段时间,但没有任何想法。请建议。 提前非常感谢。

最佳答案

原因

您已经自定义了objectMapper,并且Redis值中没有类名。所以无法反序列化为真实类型。

可以查看redis值,redis值中没有"@class": "com.xxxx.xxx.entity.xx"

我的解决方案

@Bean
public RedisCacheConfiguration redisCacheConfiguration(ObjectMapper objectMapper) {
    // Do not change the default object mapper, we need to serialize the class name into the value
    objectMapper = objectMapper.copy();
    objectMapper = objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
    return RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(1))
            .disableCachingNullValues()
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer(objectMapper)));
}

在深入研究 GenericJackson2JsonRedisSerializer.class 的源代码后,我使用了 objectMapper.enableDefaultTyping()

关于java - Spring-data-redis @Cacheable java.lang.ClassCastException : java. util.LinkedHashMap 无法转换为 MyObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49016372/

相关文章:

magento - 在 Amazon EC2 上不断收到 redis 错误

python - 导入错误 : No module named redis

mongodb - MongoDB 中删除了多少文档

java - 使用从 "App A"到 "App B"的 URI 在 Intentw 中传递参数 -Android

Java MIDI 音序器永无止境

java - 基于分隔符 java 从加密文件中读取行

java - 如何在 java 中显示 native 文件系统的文件/文件夹的 "properties window"

memcached - 大型对象的分布式缓存

java - @CreatedBy 如何在 Spring Data JPA 中工作?

java - 在 mongo 集合上使用时,Spring 数据版本注释不会递增