假设我有以下简单的Java bean:
class MyBean {
private Date startDate;
private Date endDate;
//setter, getters etc...
}
JSR 303有没有机制来创建一个自定义验证器,用于验证开始日期必须在结束日期之前的约束条件?
这似乎是一种常见的用例,但我找不到任何关于这种多属性关系约束的示例。
假设我有以下简单的Java bean:
class MyBean {
private Date startDate;
private Date endDate;
//setter, getters etc...
}
JSR 303有没有机制来创建一个自定义验证器,用于验证开始日期必须在结束日期之前的约束条件?
这似乎是一种常见的用例,但我找不到任何关于这种多属性关系约束的示例。
我能想到一些尝试的方法。
你可以创建一个目标为类型本身的约束Constraint
,并使用适当的验证器:
@ValidateDateRange(start="startDate", end="endDate")
public class MyBean {
你可以将日期范围封装在一个类型中并进行验证:
public class DateRange {
private long start;
private long end;
public void setStart(Date start) {
this.start = start.getTime();
}
// etc.
您可以添加一个简单的属性来执行检查:
public class MyBean {
private Date startDate;
private Date endDate;
@AssertTrue public boolean isValidRange() {
// TODO: null checks
return endDate.compareTo(startDate) >= 0;
}
@ScriptAssert(lang = "javascript", script = "_this.startDate.before(_this.endDate)")
public class CalendarEvent {
private Date startDate;
private Date endDate;
//...
}
您可以通过为所选脚本语言创建自定义约束条件来获得更紧凑的语法:
@JexlAssert("_.startDate < _.endDate")
public class CalendarEvent {
private Date startDate;
private Date endDate;
//...
}
由于在JSR 303验证器中无法访问bean,因此这是不可能的。
一种解决方法是提供自己的ConstraintValidatorContext
并将其扩展为引用当前正在验证的bean。但我不确定您是否可以修改/覆盖相应的工厂。