Jackson:是否存在批量标记类所有成员为必填的注解方式?
更简洁的方式标记User类所有成员为必填
针对你的需求,有几种更简洁的实现方式,不用给每个属性单独加@JsonProperty(required = true):
1. 利用final属性+构造器注入(结合Jackson的@JsonCreator)
将所有属性设为final,并通过带参数的构造器初始化,配合Jackson的@JsonCreator注解,Jackson会自动将这些构造器参数视为必填项,反序列化时必须提供对应的属性:
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; class User { private final String email; private final String name; private final String username; @JsonCreator public User( @JsonProperty("email") String email, @JsonProperty("name") String name, @JsonProperty("username") String username ) { this.email = email; this.name = name; this.username = username; } // 按需添加Getter方法,或用Lombok的@Getter注解简化 public String getEmail() { return email; } public String getName() { return name; } public String getUsername() { return username; } }
如果引入Lombok,还能进一步省去手动编写构造器和Getter的代码:
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor(onConstructor = @__(@JsonCreator)) class User { private final String email; private final String name; private final String username; }
2. 全局配置(Spring Boot环境下)
如果你的项目基于Spring Boot,可以通过全局Jackson配置,让所有未标记为可选的属性默认视为必填:
在application.properties中添加配置项:
# 反序列化时,缺失构造器所需属性则抛出异常 spring.jackson.deserialization.fail-on-missing-creator-properties=true # 反序列化时,缺失Setter对应的属性则抛出异常 spring.jackson.deserialization.fail-on-missing-setters=true
这种方式是全局生效的,适合所有类都需要严格校验必填属性的场景。
3. 结合Bean Validation验证非空(针对值不为null的场景)
如果你的需求是确保属性值不为null(而非仅仅要求属性存在),可以使用Bean Validation的注解配合验证框架实现,也能简化代码:
import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @Getter @Setter class User { @NotNull private String email; @NotNull private String name; @NotNull private String username; }
注意:这种方式需要配合验证框架(比如Spring Validation)使用,在接收请求时触发校验,和@JsonProperty(required = true)的语义不同——前者校验值非空,后者仅校验属性必须存在(允许值为null)。
内容的提问来源于stack exchange,提问作者Gabriel Rocha
相关产品推荐
相关产品推荐

