Java Beanがバリデーション(JSR303)いくつかのBeanのプロパティとの間の関係を含む制約

StackOverflow https://stackoverflow.com/questions/1700295

質問

私は次のような単純なJava Beanを持っていると言います

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

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

これは、一般的なユースケースのように私には思える、まだ私は複数のプロパティ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;
  }

他のヒント

あなたは、バージョン4.1以降で Hibernateバリを使用している場合は、

あなたが使用することができます @ScriptAssert の制約と一緒に制約のこの種を表現するためのスクリプトや表現言語。 JavaScriptのあなたの例を使用すると、次のようになります:

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

      private Date startDate;

      private Date endDate;

      //...
 } 

あなたは<のhref =「http://musingsofaprogrammingaddict.blogspot.com/2010/06/whats-new-in-hibernate-validator-41.html」のrel =「noreferrer」によって、よりコンパクトな構文を得ることができます>お好みのスクリプト言語用のカスタム制約を作成します:

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

    private Date startDate;

    private Date endDate;

    //...
}

答えは、クラスレベルのバリデータです。あなたはエンティティクラスに配置できるカスタム制約を定義することができます。検証時に、あなたははisValid()メソッドにインスタンス全体を渡されます。その後、お互いに対するあなたの二つの日付を比較することができます。また、Hibernateバリドキュメントを参照してください。

JSR 303バリでBeanにアクセスする方法がないので、

、これは不可能である。

この問題を回避するには、あなた自身のConstraintValidatorContextを供給し、現在検証している豆を参照して、それを拡張することです。しかし、私はあなたがそれぞれの工場を上書き/変更できるかどうかはわからない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top