Java类级别条件校验:如何让Pojo1.field2的@NotNull仅在Pojo3中生效
解决方案
核心用Bean Validation的分组校验+嵌套分组转换能力实现,步骤如下:
1. 定义校验分组标记接口
无需实现,仅作为规则生效的标记:
// 可根据实际包环境替换为javax.validation.groups.Default import jakarta.validation.groups.Default; public interface Pojo2Group extends Default {} public interface Pojo3Group extends Default {}
2. 调整Pojo1的注解,指定生效分组
public class Pojo1 { // field1所有场景都需校验,默认继承Default分组即可 @NotNull private String field1; // field2仅在Pojo3场景下触发@NotNull校验,指定仅对应分组生效 @NotNull(groups = Pojo3Group.class) private String field2; }
3. 调整Pojo2、Pojo3的嵌套校验配置
添加@ConvertGroup注解实现嵌套场景下的分组自动转换:
public class Pojo2 { @Valid // 嵌套校验Pojo1时,将默认分组转换为Pojo2Group,不会触发field2的@NotNull @ConvertGroup(from = Default.class, to = Pojo2Group.class) private Pojo1 pojo1; } public class Pojo3 { @Valid // 自身引用的Pojo1转换为Pojo3Group,触发field2的@NotNull @ConvertGroup(from = Default.class, to = Pojo3Group.class) private Pojo1 pojo1; @Valid // 嵌套的Pojo2走Pojo2Group规则,内部Pojo1的field2不会校验 @ConvertGroup(from = Default.class, to = Pojo2Group.class) private Pojo2 pojo2; }
4. 接口校验配置
直接在请求入口用默认规则校验Pojo3即可,Spring环境示例:
@PostMapping("/test") public void test(@Valid @RequestBody Pojo3 pojo3) { // 业务逻辑 }
你给出的测试JSON完全符合校验规则,可以正常通过:
{ "pojo1": { "field1": "something", "field2": "something" }, "pojo2": { "pojo1": { "field1": "something" } } }
内容的提问来源于stack exchange,提问作者Marcus Chiu
相关产品推荐
相关产品推荐

