Java Bean Validation(JSR303)约束涉及几个bean属性之间的关系

Hed*_*ess 22 java validation bean-validation

假设我有以下简单的java bean:

class MyBean {
   private Date startDate;
   private Date endDate;
   //setter, getters etc...
}
Run Code Online (Sandbox Code Playgroud)

JSR 303中是否有一种机制来创建一个自定义验证器来验证startDate必须在endDate之前的约束?

在我看来,它是一个常见的用例,但我找不到这种多属性关系约束的任何例子.

McD*_*ell 30

我可以想到一些事情要尝试.

您可以Constraint使用适当的验证器创建具有该类型的目标的目标:

@ValidateDateRange(start="startDate", end="endDate")
public class MyBean {
Run Code Online (Sandbox Code Playgroud)

您可以在类型中封装日期范围并验证:

public class DateRange {    
  private long start;
  private long end;

  public void setStart(Date start) {
    this.start = start.getTime();
  }

  // etc.
Run Code Online (Sandbox Code Playgroud)

您可以添加一个执行检查的简单属性:

public class MyBean {
  private Date startDate;
  private Date endDate;

  @AssertTrue public boolean isValidRange() {
    // TODO: null checks
    return endDate.compareTo(startDate) >= 0;
  }
Run Code Online (Sandbox Code Playgroud)


Gun*_*nar 14

如果您在4.1或更高版本中使用Hibernate Validator,则可以将@ScriptAssert约束与脚本或表达式语言一起使用来表达此类约束.使用JavaScript,您的示例如下所示:

 @ScriptAssert(lang = "javascript", script = "_this.startDate.before(_this.endDate)")
 public class CalendarEvent {

      private Date startDate;

      private Date endDate;

      //...
 } 
Run Code Online (Sandbox Code Playgroud)

通过为您选择的脚本语言创建自定义约束,您可以获得更紧凑的语法:

@JexlAssert("_.startDate < _.endDate")
public class CalendarEvent {

    private Date startDate;

    private Date endDate;

    //...
}
Run Code Online (Sandbox Code Playgroud)