You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:57:01