涉及几个bean属性之间的关系的Java Bean验证(JSR303)的限制
-
19-09-2019 - |
题
说我有以下简单的Java bean:
class MyBean {
private Date startDate;
private Date endDate;
//setter, getters etc...
}
有没有在JSR 303的机制来创建用于验证的startDate必须在结束日期之前约束自定义验证?
在我看来,是一种常见的情况,但我无法找到这种多个属性relationsship约束的任何实例。
解决方案
我能想到的一些东西去尝试。
您可以创建与该类型本身的目标与适当的验证一个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;
}
其他提示
如果您正在使用 Hibernate验证在4.1版本或更高版本可以使用 @ScriptAssert 约束连同脚本或表达式语言来表达这种约束。使用JavaScript的例子是这样的:
@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;
//...
}
答案是一类电平的验证。您可以定义,你可以在实体类的地方习俗的约束。在验证时,你获得通过整个实例进入isValid()方法。然后,您可以针对对方的两个日期进行比较。又见Hibernate验证文档。
由于没有办法在JSR 303验证访问豆,这是不可能的。
一个解决方法是提供自己的ConstraintValidatorContext
,并与你目前正在验证bean的引用扩展它。但我不知道你是否可以修改/覆盖各个工厂。
不隶属于 StackOverflow