23

次の単純な Java Bean があるとします。

class MyBean {
   private Date startDate;
   private Date endDate;
   //setter, getters etc...
}

JSR 303 に、startDate が endDate より前でなければならないという制約を検証するカスタム バリデータを作成するメカニズムはありますか?

私には一般的なユースケースのように思えますが、この種の複数のプロパティ関係の制約の例は見つかりません。

4

5 に答える 5

33

試してみるべきことがいくつか思い浮かびます。

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;
  }
于 2009-11-09T13:01:56.673 に答える
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;

      //...
 } 

選択したスクリプト言語のカスタム制約を作成することで、さらにコンパクトな構文を取得できます。

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

    private Date startDate;

    private Date endDate;

    //...
}
于 2011-02-04T21:22:52.907 に答える
-5

JSR 303 バリデーターでは Bean にアクセスする方法がないため、これは不可能です。

回避策は、独自のものを提供ConstraintValidatorContextし、現在検証している Bean への参照で拡張することです。ただし、それぞれのファクトリを変更/オーバーライドできるかどうかはわかりません。

于 2009-11-09T11:13:55.847 に答える