Java Beanがバリデーション(JSR303)いくつかのBeanのプロパティとの間の関係を含む制約
-
19-09-2019 - |
質問
私は次のような単純な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;
}
他のヒント
あなたが使用することができます @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バリドキュメントを参照してください。
、これは不可能である。
この問題を回避するには、あなた自身のConstraintValidatorContext
を供給し、現在検証している豆を参照して、それを拡張することです。しかし、私はあなたがそれぞれの工場を上書き/変更できるかどうかはわからない。