jackson 的 enabledefaulttyping 已过时,因全局注入 @class 字段引发安全风险(如远程代码执行)、侵入性强、json 膨胀且与新版冲突;推荐改用 @jsontypeinfo + @jsonsubtypes 显式控制,或搭配 polymorphictypevalidator 白名单机制。

Jackson 的 enableDefaultTyping 是一种早期用于支持多态反序列化的机制,它会在 JSON 中自动添加 @class 字段来记录运行时类型,从而在反序列化时能还原成正确的子类实例。不过要注意:它已被标记为 过时(deprecated),官方推荐改用更安全、更灵活的 @JsonTypeInfo 注解方式。
为什么 enableDefaultTyping 不推荐用了?
该方法会全局开启类型信息写入,对所有非 final 类型都加 @class,带来明显隐患:
- 安全性风险:攻击者可构造恶意
@class值触发任意类加载(如java.lang.ProcessBuilder),造成远程代码执行 - 侵入性强:无法细粒度控制哪些类需要序列化类型,哪些不需要
- JSON 膨胀:每个对象都带额外字段,影响可读性和传输体积
- 与现代 Jackson 版本(2.10+)默认配置冲突,容易引发异常
替代方案:用 @JsonTypeInfo + @JsonSubTypes(推荐)
显式声明多态策略,只在需要的地方启用,安全可控:
示例:动物体系// 基类
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "@type"
)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
abstract class Animal {
String name;
}
class Dog extends Animal { int barkLevel; }
class Cat extends Animal { boolean isFluffy; }
序列化结果类似:{"@type":"dog","name":"旺财","barkLevel":3}
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
这样既保留了多态能力,又避免了泛滥的 @class 和安全隐患。
如果必须用 enableDefaultTyping(调试或遗留系统)
仅限开发/测试环境,且需严格限制作用域:
- 用
ObjectMapper.enableDefaultTyping(DefaultTyping.NON_FINAL)(比OBJECT_AND_NON_CONCRETE更保守) - 配合
SimpleModule设置白名单,禁用危险类(需自定义ClassLoader或DeserializationProblemHandler) - 务必关闭
mapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES),否则@class字段会报错 - 生产环境绝对不要启用,尤其面对不可信输入时
补充:Jackson 2.10+ 的新选项——PolymorphicTypeValidator
若仍需动态类型解析(如插件系统),应使用白名单机制:
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
.allowIfSubType(Dog.class)
.allowIfSubType(Cat.class)
.build();
ObjectMapper mapper = JsonMapper.builder()
.polymorphicTypeValidator(ptv)
.build();
这是目前最安全、最推荐的多态类型管控方式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










