【问题标题】:Java Validate Field Conditional On Class LevelJava 在类级别上验证字段条件
【发布时间】:2021-09-09 04:08:25
【问题描述】:

假设我有以下 Pojos 和约束。

public class Pojo1 {
    @NotNull
    private String field1;
    @NotNull
    private String field2; // <--- I only want this NotNull in Pojo3.java but not in Pojo2.java
}

public class Pojo2 {
    @Valid
    private Pojo1 pojo1;
}

public class Pojo3 {
    @Valid
    private Pojo1 pojo1;
    @Valid
    private Pojo2 pojo2;
}

我希望 Pojo1.field2 仅在 Pojo3 下验证,而不是在 Pojo2 下验证。换句话说,下面的 JSON 应该通过验证

{
   "pojo1": {
      "field1": "something",
      "field2": "something"
   },
   "pojo2": {
      "pojo1": {
         "field1": "something"
      }
   }
}

【问题讨论】:

  • 如何触发验证?
  • @NikolaiShevchenko 验证由 javax.validation 包中的对象处理,并由您的 mvc 环境为带有 @Valid 注释的输入对象自动触发(例如 Spring RestController 处理它)。您也可以使用javax.validation.Validator 手动触发它。精彩介绍:link.
  • @SebastianM 是的,我知道这一点。但是还有另一种方法可以使用javax.validation.Validator.validate(T object, Class... groups); 方法手动触发验证。所以才问触发方式
  • @NikolaiShevchenko 我正在使用 Spring 来处理验证。但如果需要,我可以使用手动验证。我已经研究过组验证,但我认为它不会解决问题

标签: java validation


【解决方案1】:

尝试用 Pojo3 上的自定义验证替换 Pojo1.field2 验证,例如:

public class Pojo1 {

    @NotNull
    private String field1;

    // @NotNull // don't validate it generally
    private String field2;
}
public class Pojo2 {
    @Valid
    private Pojo1 pojo1;
}

public class Pojo3 {

    @Valid
    private Pojo1 pojo1;

    @Valid
    private Pojo2 pojo2;

    @javax.validation.constraints.AssertTrue
    public boolean isPojo1Valid() {
        return pojo1 == null || pojo1.getField2() != null;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2014-07-27
    • 2020-01-13
    • 1970-01-01
    • 2017-12-09
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多