2012-01-13 3 views
1

私はBeanを設定してHibernate Validator(検証用)とGoogle Guice(DIとメソッド傍受用)の両方を使用したいと考えています。 Hibernateバリだけあなたがパスを決定することを可能にするようHibernate Validator:無効な値を傍受する

public class Widget { 
    @NotNull 
    public Fizz getFizz() { 
     return fizz; 
    } 
} 

public class FailedWidgetInterceptor implements MethodInterceptor { 
    public Object invoke(MethodInvocation invocation) throws Throwable { 
     // This gets executed if Widget's getFizz() returns null... 
    } 
} 

しかし、それはなります

理想的には、私が「失敗」のいずれかの方法で検証がメソッドのインターセプタが呼び出されることになりますセットアップをしたいのですがオブジェクトに明示的にオブジェクトTを渡してClassValidator<T>getInvalidValues()メソッドに/ fail状態を渡します。

私はこのような呼び出しを行う場所が必要です! GuiceのModule

@NotNull 
public @interface AutoValidatingNotNull { 
    // ...?? 
} 

そして:

私は考えることができる のみ実行可能な解決策は、私自身の注釈(!私は 前にやったことがないました)このようになります作成することです。
public class WidgetModule implements Module { 
    public void configure(Binder binder) { 
     binder.bindInterceptor(
      any(), 
      annotatedWith(AutoValidatingNotNull.class), 
      new ValidatingWidgetInterceptor() 
     ); 
    } 
} 

public class ValidatingWidgetInterceptor implements MethodInterceptor { 
    public Object invoke(MethodInvocation invocation) throws Throwable { 
     ClassValidator<Widget> widgetValidator = new ClassValidator<Widget>(); 

     InvalidValue[] badVals = widgetValidator.getInvalidValues(widget); 

     if(badVals.length > 0) 
      handleFailedValidationAndThrowRuntimeExceptionOrSomething(); 
    } 
} 

最後に、getFizz()を変更するには:

@AutoValidatingNotNull 
public Fizz getFizz() { 
    return fizz; 
} 

1については、トン彼の唯一のはほぼです。インターセプタのinvokeメソッドの中でwidgetインスタンス(私たちが検証したいもの)に手を差し伸べるにはどうしたらいいですか?。アノテーションを使用してwidgetインスタンスを渡す方法はありますか?

編集:私は(パラメータとして)の注釈にObjectを渡すことができるように
は...

第二を見ていない、これは一種の厄介です。おそらく、私はこれのすべてを世話するHibernate Validatorが提供するものを見落としていますか?行く良い方法はありますか?前もって感謝します!

答えて

1

ClassValidatorなどのあちこちでHibernate Validator 3.x APIを使用しているようです。

API for method validationが紹介された4.2にアップグレードすることをお勧めします。

GoogleのGuiceのでそのAPIを統合するために必要なグルーコードの例は、私がGitHubの上でしばらく前に作成されたthis projectで見つけることができます。

+0

ワウ。 Gunnarあなたは私の本の中ですばらしい人です...あなたは今あなたのコードを見ていて、私がここに座って、私が必要とする正確な解決策を既に持っている問題を解決しようとしていることに気が付きました。あなたはあなたの注釈を '@ AutoValidating'と呼んでいました... deja vu!ありがとうございました! – IAmYourFaja

+0

ちょっと、簡単な質問:あなたのmethodvalidation-guiceプロジェクトがどこかにあるかもしれませんか?私は中央のレポを探していて見つけていない。これを私のプロジェクトに依存するものとして宣言するとよいでしょう。私のAOP /検証の質問すべてにあなたの助けをお寄せいただきありがとうございます! – IAmYourFaja

+0

いいえ、プロジェクトはMaven Centralや他のリポジトリにありません。他の人が足を踏み入れるまでメソッドバリデーション機能を統合するために、プロジェクト全体を多かれ少なかれプレイグラウンドとして始めました。 Spring 3.1以降、彼らはすぐにそれをサポートしています.CDIのためにSeam Validationがあるので、GitHubに関する私のプロジェクトは多かれ少なかれ時代遅れになっています.Guiceの部分は例外です。必要な部分をコードベースにコピーして、必要に応じてそれを適用することをお勧めします。 – Gunnar