Spring Boot中使用注解实现POJO嵌套JSON字段的非空校验
嵌套JSON字段注解校验实现方案
现有写法存在两个核心错误:
- POJO结构没有匹配JSON的嵌套层级,直接把所有嵌套字段平铺到根POJO里,无法和JSON结构完成映射
- 没有添加
@Valid注解触发级联校验,嵌套对象内部的约束默认不会生效
额外注意:你提供的JSON示例存在重复的c键,JSON解析时前一个c节点会被后一个覆盖,导致attribute4丢失,建议先调整为唯一键,比如将第一个c改为c1,第二个保留为c2。
1. 编写各嵌套节点对应的POJO
对应b节点的类:
import javax.validation.constraints.NotBlank; public class B { @NotBlank(message = "Bad request") private String attribute3; // 补全getter、setter方法 }
对应第一个c节点(改名为c1)的类:
import javax.validation.constraints.NotBlank; public class C1 { @NotBlank private String attribute4; // 补全getter、setter方法 }
对应第二个c节点的类:
import javax.validation.constraints.NotBlank; public class C2 { @NotBlank private String attribute5; @NotBlank private String attribute6; // 补全getter、setter方法 }
2. 编写根节点POJO,添加@Valid触发级联校验
@Valid注解需加在嵌套对象字段上,才会自动校验该对象内部的约束规则:
import javax.validation.Valid; import javax.validation.constraints.NotNull; public class RootJsonPojo { @NotNull // 保证b对象本身不为空 @Valid // 触发b对象内部的字段校验 private B b; @NotNull @Valid private C1 c1; @NotNull @Valid private C2 c2; // 其他字段a、d按需添加,补全所有字段的getter、setter方法 }
3. 触发全量校验
如果是SpringBoot项目,在Controller的请求体参数前添加@Valid或@Validated注解即可触发全层级校验:
@PostMapping("/check") public String checkParam(@RequestBody @Valid RootJsonPojo param) { // 业务逻辑处理 }
补充说明:你之前混用的@NonNull是Lombok提供的编译期注解,和运行时参数校验无关,无需重复添加,@NotBlank已经覆盖了字符串非空、非空白的校验逻辑。
内容的提问来源于stack exchange,提问作者Ankit Baria
相关产品推荐
相关产品推荐

