说我有以下简单的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的引用扩展它。但我不知道你是否可以修改/覆盖各个工厂。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top