问题现象
在参考网上的Redis集成后,配置了RedisTemplate的序列化,配置成功后@Cacheable注解的缓存仍然是jdk的序列化,配置无效。
参考配置的类似代码:
java">@Bean("redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
var jackson2JsonRedisSerializer = getJackson2JsonRedisSerializer();
// 设置value的序列化规则和key的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
public static GenericJackson2JsonRedisSerializer getJackson2JsonRedisSerializer() {
var jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
jackson2JsonRedisSerializer.configure(objectMapper -> {
// add java8 time module
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator(),
ObjectMapper.DefaultTyping.EVERYTHING);
JavaTimeModule javaTimeModule = new JavaTimeModule();
objectMapper.registerModule(javaTimeModule);
});
return jackson2JsonRedisSerializer;
}
问题原因
@Cacheable未使用RedisTemplate,所以操作无效。他使用的是CacheManager
问题解决
配置CacheManager即可。
我们可以使用 RedisCacheManagerBuilderCustomizer
来自定义CacheManager
java">public class MyRedisCacheManagerBuilderSerialCustomizer implements RedisCacheManagerBuilderCustomizer {
@Override
public void customize(RedisCacheManager.RedisCacheManagerBuilder builder) {
RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();
var jackson2JsonRedisSerializer = getJackson2JsonRedisSerializer();
var configuration = builder.cacheDefaults()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
builder.cacheDefaults(configuration);
var configuredCaches = builder.getConfiguredCaches();
// 针对有的缓存存在自定义配置的情况,读取所有缓存的配置,设置序列化方法
for (String configuredCache : configuredCaches) {
var cacheConfig = builder.getCacheConfigurationFor(configuredCache);
cacheConfig.ifPresent(config -> {
var newConfig = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
builder.withCacheConfiguration(configuredCache, newConfig);
});
}
}
}