
本文介绍在使用 Lombok 与 Jackson 时,如何在不改动 @Data/@SuperBuilder 类定义的前提下,实现对 @JsonProperty(required = true) 的严格反序列化校验(如缺失 id 时抛出异常)。核心方案是启用全局 FAIL_ON_MISSING_CREATOR_PROPERTIES 配置,无需添加 @JsonCreator 或调整实体类。
本文介绍在使用 lombok 与 jackson 时,如何在不改动 `@data`/`@superbuilder` 类定义的前提下,实现对 `@jsonproperty(required = true)` 的严格反序列化校验(如缺失 `id` 时抛出异常)。核心方案是启用全局 `fail_on_missing_creator_properties` 配置,无需添加 `@jsoncreator` 或调整实体类。
Jackson 默认行为下,@JsonProperty(required = true) 仅作为文档提示,并不会在反序列化时触发校验——尤其当类使用无参构造器(如 @NoArgsConstructor)时,Jackson 会绕过属性级 required 约束,静默填充 null。这正是你遇到的问题:{"name":"blablabla"} 被成功解析为 User{id=null, name="blablabla"},而未按预期失败。
✅ 正确解法:启用 Jackson 全局校验策略
无需修改 User 类(保留 @SuperBuilder、@NoArgsConstructor 等所有 Lombok 注解),只需配置 ObjectMapper 启用严格模式:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true); // 注意:此配置仅对「通过构造器/工厂方法创建实例」的场景生效
⚠️ 关键前提:Jackson 必须使用带参构造器(而非无参构造 + setter)来实例化对象。由于你已声明 @AllArgsConstructor(access = AccessLevel.PROTECTED),Jackson 在启用了 FAIL_ON_MISSING_CREATOR_PROPERTIES 后,会自动优先选择该受保护构造器,并将 JSON 字段绑定到其参数——此时 required = true 才真正生效。
但默认情况下,Jackson 仍可能回退到无参构造器(因 @NoArgsConstructor 存在)。为确保走构造器路径,推荐显式指定构造器用途(非必须,但更健壮):
@SuperBuilder
@Getter
@EqualsAndHashCode
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString
public class User {
@JsonProperty(required = true) // 保留注解,增强可读性
private String id;
private String name;
// ✅ 可选:显式标注构造器(Jackson 2.12+ 支持)
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
protected User(@JsonProperty(value = "id", required = true) String id,
@JsonProperty("name") String name) {
this.id = id;
this.name = name;
}
}
? 验证效果:
Node.js 可靠编程下载Node.js 可靠编程技能。避免事件循环阻塞、异步陷阱、ESM 兼容问题和内存泄漏。触发词:Node.js 开发、async/await、流处理、性能优化、安全编码。
String test = "{\"name\":\"blablabla\"}"; User user = objectMapper.readValue(test, User.class); // 抛出 JsonMappingException: // "Missing required creator property 'id'"
? 补充说明:
-
FAIL_ON_MISSING_CREATOR_PROPERTIES是 Jackson 2.7+ 引入的开关,专为解决此类问题设计; - 若项目中大量使用 Lombok,建议在
ObjectMapperBean 初始化时统一配置,避免重复设置; - 不推荐依赖
@JsonCreator静态工厂方法(如答案中所写),因其需手动维护参数与字段一致性,且破坏了 Lombok 构造器的自动生成优势; -
@JsonProperty(required = true)在生成 OpenAPI 文档时仍有价值,建议保留。
综上,最佳实践是:保持类定义简洁(纯 Lombok 注解),通过 ObjectMapper 全局配置 + 合理构造器可见性,实现零侵入、强约束的 JSON 必填字段校验。











