让Redis jackson序列化带上class类路径信息的配置方法

先放配置

配置显示class和不显示class的区别就是,不显示class就是一个普通的json串,jackson反序列化时会生成一个LinkedHashMap对象,显示class时json传里会带上class全路径的信息,jackson反序列化会生成对应的类对象。

	@Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory, Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = new ObjectMapper();
        builder.configure(objectMapper);
        objectMapper = objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
        
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        return redisTemplate;
    }

几个细节

1 如果这里不用 new GenericJackson2JsonRedisSerializer(objectMapper) 而是用 RedisSerializer.json(),也是同样可以显示class信息的,但是他有个问题,就是系统设置的自定jsonIgonre等注解没法用,这个在为什么序列化无效里讲过
所以必须用全局配置过的objectMapper
2 为什么不用objectMapper的bean,因为这个bean是spring定义的,用来spring mvc序列化等,他的配置就是不可以显示类信息,否则抛送给前端有安全风险。所以用spring的objectMapperBuilder重新配置了一个ObjectMapper,即
builder.configure(objectMapper);
这行代码,
然后用显示类信息的配置覆盖了原有配置,即
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
这行代码
3 为什么非得带上类信息,因为redis经常需要复杂对象序列化反序列化,如果没有类信息的话会被反序列化为LinkedHashMap

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis序列化配置主要是由以下两个组成: 1. RedisTemplate<K, V>:是Spring Data Redis模块提供的Redis操作模板,用于操作Redis数据存储。该包含了Redis序列化方式配置。 2. RedisSerializer<T>:是Redis序列化接口,用于将Java对象序列化Redis的存储格式,并将Redis存储格式反序列化Java对象。RedisSerializer的实现有很多,其中默认实现了以下几种: - JdkSerializationRedisSerializer:使用JDK自序列化方式(ObjectOutputStream/ObjectInputStream),将Java对象序列化为二进制格式,并存储在Redis中。 - Jackson2JsonRedisSerializer:使用Jackson库将Java对象序列化为JSON格式,并存储在Redis中。 - GenericJackson2JsonRedisSerializer:基于Jackson2JsonRedisSerializer实现,支持泛型类型序列化。 - StringRedisSerializer:将Java对象序列化为字符串格式(采用UTF-8编码),并存储在Redis中。 在RedisTemplate中配置RedisSerializer的方式如下: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); //设置key的序列化方式 redisTemplate.setKeySerializer(new StringRedisSerializer()); //设置value的序列化方式 redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); return redisTemplate; } } ``` 在上述配置中,我们采用了StringRedisSerializer将key序列化为字符串格式,采用Jackson2JsonRedisSerializer将value序列化为JSON格式。当然,你也可以根据需求选择其他的序列化方式。总之,通过RedisTemplate的配置,我们可以很方便地实现对Redis数据的序列化和反序列化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值