前提

由于平台提供的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);
    }
}