@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
// 设置 ObjectMapper 的可见性,将所有属性设置为可见性,包括私有属性。
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 配置 ObjectMapper,在遇到未知属性时不会抛出异常。
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 激活 ObjectMapper 的默认类型信息,将类型信息作为属性添加到 JSON 字符串中。
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.EVERYTHING,
JsonTypeInfo.As.PROPERTY);
// objectMapper.deactivateDefaultTyping(); 这个配置不会添加全类名
// 配置好的 ObjectMapper 设置到 jsonRedisSerializer 中。
jsonRedisSerializer.setObjectMapper(objectMapper);
// 设置 RedisTemplate 的值序列化器为 jsonRedisSerializer。
redisTemplate.setValueSerializer(jsonRedisSerializer);
// 设置 RedisTemplate 的键序列化器为 StringRedisSerializer。
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置 RedisTemplate 的哈希键序列化器为 StringRedisSerializer。
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// 设置 RedisTemplate 的哈希值序列化器为 jsonRedisSerializer。
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
// 对 RedisTemplate 进行必要的初始化。
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
补充说明
这几句代码会在序列化的Json字符串中添加全类名
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.EVERYTHING,
JsonTypeInfo.As.PROPERTY);
如果这样配置则不会添加全类名
objectMapper.deactivateDefaultTyping(); // 这个配置不会添加全类名
添加全类名的好处
在序列化后的 JSON 字符串中添加全类名信息可以带来以下几个作用:
-
类型安全性: 添加全类名信息可以确保在反序列化时,能够正确地将 JSON 字符串转换回相应的对象。类型信息可以帮助反序列化程序识别并实例化正确的对象类型,避免数据丢失或类型转换错误。
-
多态性支持: 通过添加全类名信息,可以在反序列化时恢复对象的多态性。即使序列化的对象是某个具体子类的实例,也能够在反序列化时正确地还原为该子类的对象,而不仅仅是基类或接口类型。
-
版本兼容性: 类名信息对于处理版本迁移和兼容性非常有用。当你修改了对象的类名或类结构时,反序列化程序可以使用类名信息来适应新的类结构,而不会导致反序列化失败或数据丢失。
需要注意的是,将全类名信息添加到 JSON 字符串中可能会增加序列化后的字符串长度,增加存储空间和网络传输成本。因此,在决定是否添加全类名信息时,需要考虑到应用程序的具体需求和性能要求。