前提
由于平台提供的redis序列化配置,不满足个别微服务的需求。故需要对平台的redis序列化进行动态配置扩展
如下是平台提供的redis序列化配置:
@Bean
public static RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// key的序列化采策略
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
//value的序列化采策略---protostuff-version
@SuppressWarnings("all") final Protostuff2RedisSerializer protostuffRedisSerializer = new Protostuff2RedisSerializer<>();
redisTemplate.setValueSerializer(protostuffRedisSerializer);
// 配置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
扩展配置
由于本微服务需要对hash类型的值进行json序列化,所以需要进行定制。实现方式主要就是通过监听Spring容器启动完成事件,从容器中获取到RedisTemplate实例,对实例相应属性进行设置就ok了
代码如下:
/**
* redis扩展配置
*/
@Slf4j
@Component
public class RedisExtendConfigListener implements ApplicationListener<ApplicationReadyEvent> {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
log.info("执行redis扩展配置...");
ApplicationContext ctx = event.getApplicationContext();
RedisTemplate<String, Object> template = (RedisTemplate<String, Object>) ctx.getBean("redisTemplate");
// json序列化
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(mapper);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
}
}