3

現在、JSR303アノテーションを使用したメソッド検証のHibernateバリデーターサポートを使用して調査しています。最初の試みは、検証を実行したプロキシ(cglibを使用して生成された)でリソースをラップしようとしましたが、私が試したプロキシメソッドはパラメーターアノテーションをコピーしていないようであるため、これは行き止まりになっているようです。これに依存するリソースメソッドは、パラメータなしで呼び出されることになります。そのアイテムについて、現時点で別の質問があります。

メソッドのパラメーターアノテーションを保持する動的プロキシをJavaで作成するにはどうすればよいですか?

プロキシを使用せずにこのようなことを行うためにウィンクのリクエストチェーンにフックする代替メカニズムはありますか?

4

2 に答える 2

4

これは、RequestHandlerを作成し、実際の HandlersFactory をオーバーライドしリクエスト ハンドラーを含むリストを返すことにより、部分的にサポートされている方法です。この設定については、こちらで説明しています。このリクエスト ハンドラは、InvokeMethodHandler (最後に呼び出されたリクエスト ハンドラであり、実際にリソース メソッドを呼び出すもの) の直前に、リクエスト処理チェーンに挿入されます。

(実際に JAX/RS リソースを呼び出す) InvokeMethodHandlerのソース コードを読むことに基づいて、次のようにパラメーター、インスタンス、およびメソッド パラメーターを取得できます。

   // Get Method Validator from hibernate 
   MethodValidator validator = Validation.byProvider(HibernateValidator.class).configure()
            .buildValidatorFactory().getValidator().unwrap(
                    MethodValidator.class);

    // Extract the method parameters, object instance and method metadata from the JAX/RS internals.
    Method javaMethod = null;
    Object instance = null;
    Object[] parameters = null;
    SearchResult searchResult = context.getAttribute(SearchResult.class);

    javaMethod = searchResult.getMethod().getMetadata()
            .getReflectionMethod();

    parameters = searchResult.getInvocationParameters();
    instance = searchResult.getResource().getInstance(context);

    // Use all this to perform validation...
    Set<MethodConstraintViolation<Object>> violations = validator
            .validateAllParameters(instance, javaMethod, parameters);
    if (!violations.isEmpty()) {
         // do something with the violations here 
    }

インスタンス、パラメーター、およびメタデータを取得するために wink の実装の詳細に依存しているため (私が知る限り文書化されていません)、これはややハックです (この情報にアクセスするためのパブリックな方法が提供されているとよいでしょう)。ただし、プロキシで発生するリフレクションから複数のオーバーヘッドを推測しないため、プロキシを使用するよりも多少望ましいです。

于 2011-08-09T14:31:40.203 に答える