0%

Jackson ObjectMapper 中的 enableDefaultTyping 方法从 2.10.0 开始标记为过期

Spring Boot 整合 Redis 时,我们经常用 Jackson2JsonRedisSerializer 替换原来的 Serializer,代码一般如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
@SuppressWarnings({"rawtypes", "unchecked"})
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);

template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}

Jackson ObjectMapper 中的 enableDefaultTyping 方法由于安全原因,从 2.10.0 开始标记为过期,建议用 activateDefaultTyping 方法代替,所以如果继续使用 enableDefaultTyping 会有警告出现,我们现在要消除这个警告,去看一下 enableDefaultTyping 源码(注意 @deprecated 信息):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* @deprecated Since 2.10 use {@link #activateDefaultTyping(PolymorphicTypeValidator,DefaultTyping)} instead
*/
@Deprecated
public ObjectMapper enableDefaultTyping(DefaultTyping dti) {
return enableDefaultTyping(dti, JsonTypeInfo.As.WRAPPER_ARRAY);
}

/**
* @deprecated Since 2.10 use {@link #activateDefaultTyping(PolymorphicTypeValidator,DefaultTyping,JsonTypeInfo.As)} instead
*/
@Deprecated
public ObjectMapper enableDefaultTyping(DefaultTyping applicability, JsonTypeInfo.As includeAs) {
return activateDefaultTyping(getPolymorphicTypeValidator(), applicability, includeAs);
}

可以看到 enableDefaultTyping 实际调用了 activateDefaultTyping方法,getPolymorphicTypeValidator 方法源码如下:

1
2
3
public PolymorphicTypeValidator getPolymorphicTypeValidator() {
return _deserializationConfig.getBaseSettings().getPolymorphicTypeValidator();
}

直接在 BaseSettingsgetPolymorphicTypeValidator 方法中打个断点,看默认用的是哪个 PolymorphicTypeValidator 实例,如下:
validator

所以代码修改如下,消除过期警告:

1
2
3
4
5
6
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);