2011-12-06 11 views
7

フィールド(Stringの場合)にスタンダント制約(3〜240文字の長さのヌル英数字以外の文字列のような)を設定したい場合は、この制約のモデルコード内のまた、これはオーバーライドされますか、またはオーバーライドされたアノテーションのために2回だけ検証されますか?JSR 303カスタム制約オーバーライド

それはあなたが

に答えるために、この

@AlphanumericString 
@Size(min=100, max=150) //override standart values from AlphanumericString annotation 

おかげのようなものでなければならOK、自分自身に答えます。ウィッヒは、ネストされた注釈パラメータ

@Numerical 
@Size //arbitrary parameter values 
@ConstraintValidator(FrenchZipcodeValidator.class) 
@Documented 
@Target({ANNOTATION_TYPE, METHOD, FIELD}) 
@Retention(RUNTIME) 
public @interface FrenchZipCode { 
    String message() default "Wrong zipcode"; 
    String[] groups() default {}; 

    @OverridesParameters({ 
     @OverridesParameter(constraint=Size.class, parameter="min") 
     @OverridesParameter(constraint=Size.class, parameter="max") }) 
    int size() default 5; 

    @OverridesParameter(constraint=Size.class, parameter="message") 
    String sizeMessage() default "{error.zipcode.size}"; 

    @OverridesParameter(constraint=Numerical.class, parameter="message") 
    String numericalMessage() default "{error.zipcode.numerical}"; 
} 

source

答えて

5

それはいい質問だに再割り当てすることができます@OverridesParameterあります。 JSR 303 Bean Validation specificationには、3.5項の検証ルーチンが記述されています。すべての実行、すべての到達可能なフィールドの

  • :与えられたグループは、検証するため

    は、 所与Beanインスタンスに適用される検証ルーチンが順不同に次の制約を 検証を実行することが期待されます指定された妥当性検査制約が、与えられたナビゲーションパス (前のセクションの3.5.1を参照)のこの妥当性検査ルーチンの間に既に処理されていない限り、ターゲットの グループに一致するフィールドレベルの妥当性検査(スーパークラスで表現されたものを含む)グループマッチ。

...

オブジェクト検証ルーチンは、として記載されています。各 制約宣言のために:

  • 制約宣言、使用する適切なConstraintValidator(セクション3.5.3を参照)を決定。
  • のisValidがtrueを返す場合ビーン検証プロバイダの移入さのisValidがfalseを返した場合は、次の制約、
  • に進み、
  • (2.4節を参照)、適切なデータに(制約バリデーションの実装から)のisValidの操作を実行ConstraintViolationオブジェクトは、セクション2.4で定義されたルールに従って、これらのオブジェクトを制約違反のリストに追加します。あなたのケースでは

、あなたは、ターゲットグループがDefaultあるシンプルStringフィールドの検証を扱います。あなたは2つのバリデーション制約(@AlphanumericStringと@Size)を持っています。これらのバリデーションは、ドキュメントに従って特定の順番で別々に検証/処理されます。

あなたの質問にお答えください。いいえ、@Sizeを追加使用すると、@AlphanumericStringに適用されるオーバーライドはありません。私はあなたがしようと考えるものを達成することができるようにするには、あなたがそのような注釈を構成するから属性をoverridde 制約組成作成することがあります。

@Pattern(regexp="[a-zA-Z]*") 
@Size 
@Constraint(validatedBy = AlphanumericStringValidator.class) 
@Documented 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface AlphanumericString { 
    // ... 
    @OverridesAttribute(constraint=Size.class, name="min") 
    int min() default 3 
    @OverridesAttribute(constraint=Size.class, name="max") 
    int max() default 230;  
    // ... 
} 

をし、そのようにそれを使用します。

@AlphanumericString(min = 100, max = 150) 
+0

をありがとう、すでにそれを考え出し、このメソッドを使用しようとすると、アプリケーションごとにバリデーター・ファクトリをインスタンス化するだけでなく、バ​​リデーション・ファクトリをグループ化し、より速い処理時間からより遅い処理時間にオーダーすること以外は、 – Pilgrim

関連する問題