2009-04-15 17 views
3

いくつかのフィールドを持つJavaクラスがある場合は、Hibernate Validatorを使用して検証したいと思っています。 これで、ユーザーが実行時にどの検証が実行されるかを設定できるようになりました。例えば実行時にアノテーション/ Hibernate検証ルールを変更するにはどうすればよいですか?

public class MyPojo { 
    ... 

    @NotEmpty 
    String void getMyField() { 
     ... 
    } 

    ... 
} 

私はそれを行うことができますどのように、のは、私はNotEmptyチェックを削除するか、またはEmailCreditCardNumberとそれを交換したいとしましょうか?それも可能ですか?実行時にアノテーションを変更することになると思います...

答えて

2

正常に行うことはできません。

ここでは、Hibernate Validatorを使用してより動的なバリデーションを行う方法を説明します。

  1. ClassValidatorクラスを拡張します。
  2. getInvalidVaues(Object myObj)メソッドをオーバーライドします。まず、super.getInvalidValues(myObj)に電話をかけ、カスタマイズした検証にフックを追加します。
  3. カスタムバリデータをインスタンス化し、getInvalidValuesを呼び出して検証します。この時点で、任意の休止状態の注釈付き検証が開始され、カスタム動的検証(注釈でサポートされていないもの)も同様に開始されます。

例:よう

public class MyObjectValidator extends ClassValidator<MyObject> 
{ 
    public MyObjectValidator() 
    { 
     super(MyObject.class); 
    } 

    public InvalidValue[] getInvalidValues(MyObject myObj) 
    { 
     List<InvalidValue> invalids = new ArrayList<InvalidValue>(); 
     invalids.addAll(Arrays.asList(super.getInvalidValues(myObj))); 

     // add custom validations here 
     invalids.addAll(validateDynamicStuff(myObj)); 

     InvalidValue[] results = new InvalidValue[invalids.size()]; 
     return invalids.toArray(results); 
    } 

    private List<InvalidValue> validateDynamicStuff(MyObject myObj) 
    { 
     // ... whatever validations you want ... 
    } 

} 

だからあなたのカスタム検証コードは、ロジックを含めることができます「ユーザーがそれを設定した場合、この検証を行い、それ以外の場合はそのいずれかを実行します」などあなたはしてもしなくてもよいことができるかもしれませんhibernateバリデーションを実行するのと同じコードを活用することができますが、いずれにせよ、あなたがやっていることは、hibernateバリデーターの「通常の」ユースケースに関係しています。

0

アノテーションを削除または変更することはできません。クラス定義の一部です。実行時には可能ですが、少しだけ新しいクラスを作成することができます。 Hibernateは、検証へのプログラムによるアクセスをサポートし、アノテーションをオーバーライドできるようにすることができます。APIはよくわかりません。 Hibernateはランタイムクラスを構築していますが、興味があればそれを行う方法を学ぶには良い場所かもしれません。

+0

アノテーションを無効にする_wont_work。 hibernateバリデータをカスタマイズする1つの方法は、独自の注釈を記述することですが、DRが実行しようとしているもの、b/cでは実行時に動的値にアクセスできませんに添付。注釈を構成するための注釈への入力はすべて定数でなければなりません。動作するものについては、以下の私の答えをチェックしてください。 –

1

実際には、ハイバーネーションバリデータ4.1でも可能です。 programatic constraint creationに関するドキュメントを読んでください。

関連する問題