我正在使用 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;
}
}
我研究了很长一段时间,但没有任何想法。请建议。 提前非常感谢。
最佳答案
原因
您已经自定义了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/