RedisConfig中enableDefaultTyping方法已弃用,对应的替代方案是什么
问题说明
Jackson从2.10版本开始将enableDefaultTyping系列方法标记为弃用,原因是该方法未做类型校验,存在反序列化安全漏洞风险,官方推荐使用activateDefaultTyping方法作为替代实现。
替代实现代码
你只需要将原有代码中的om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);替换为新的API调用即可,完整修改后的配置类如下:
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; @Configuration public class RedisConfig { @Bean public StringRedisTemplate redisTemplate(RedisConnectionFactory factory) { ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 替换弃用的enableDefaultTyping方法 om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); // 配置Redis序列化规则 Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisTemplate template = new StringRedisTemplate(factory); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashKeySerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
参数说明
- 第一个参数
LaissezFaireSubTypeValidator.instance是Jackson提供的宽松类型验证器,和原有enableDefaultTyping的行为完全兼容,允许所有非final类型的序列化/反序列化操作 - 第二个参数沿用原有
ObjectMapper.DefaultTyping.NON_FINAL枚举,逻辑和旧代码完全一致 - 如果对安全性要求较高,可以自定义
PolymorphicTypeValidator实现,限制只允许指定包路径下的类参与反序列化,避免恶意代码执行风险
内容的提问来源于stack exchange,提问作者Avinash Kumar Singh
相关产品推荐
相关产品推荐

