因为在缓存管理器中配置的是使用 Jackson2JsonRedisSerializer
对象作为值的序列化器。
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisSerializer<String> strSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jacksonSeial =
new Jackson2JsonRedisSerializer(Object.class);
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1))
.serializeKeysWith(RedisSerializationContext.SerializationPair
.fromSerializer(strSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(jacksonSeial))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager
.builder(redisConnectionFactory).cacheDefaults(config).build();
return cacheManager;
}
Jackson 反序列化过程通常会生成一个 LinkedHashMap
的实例来表示 JSON 数据的键值对结构,特别是当 Jackson 没有具体的类型信息来实例化特定的对象类型时。
所以在业务层中把持久层访问的对象转为LinkedHashMap 类型即可。
@Cacheable(cacheNames = "comment",unless = "#result==null")
public Comment findById(int comment_id){
ObjectMapper mapper = new ObjectMapper();
// 获得类型工厂 指定了要构造的 Map 的类型以及键和值的类型。
MapType mapType = mapper.getTypeFactory().constructMapType(LinkedHashMap.class, String.class, Object.class);
Optional<Comment> optional = commentRepository.findById(comment_id);
System.out.println("optional = " + optional);
if(optional.isPresent()){
return mapper.convertValue(optional.get(),mapType);
}
return null;
}