2

クラスと関数名を指定し、その基準に基づいて関数呼び出しをインターセプトできる汎用関数を grails で作成しようとしています。

getSomeClass().metaClass.invokeMethod = { String methodName, args ->
    MetaMethod someAction =  getSomeClass().metaClass.getMetaMethod(methodName, args)
    def result = someAction.invoke(delegate, args)
    if (methodName==getSomeMethodName())
        intercept(args, result)
    return result
}

これは、POGO およびドメイン クラスでは機能しますが、コントローラー クラスでは機能しないようです。Grails で利用可能な Controller インターセプターとフィルターがあることは十分承知していますが、これらは私が達成しようとしていることを実際に集中化するものではなく、いくつかの集中化された動作のための単純な汎用関数を作成しようとしていました。

これがコントローラーで機能しない理由についてのガイダンスをいただければ幸いです。

4

2 に答える 2

3

あなたのアプローチは、Groovy メタクラス メカニズムを介して行われるメソッド呼び出しに対しては機能しますが、Grails 2 では、これはコントローラー アクションには適用されません。通常の Java リフレクション ( java.lang.reflect.Method.invoke) を使用して呼び出されるため、カスタムinvokeMethodはバイパスされます。

Java からの呼び出しだけでなく Groovy からの呼び出しでも機能する AOP メカニズムが必要な場合は、おそらく AspectJ ロードタイム ウィービングのようなものを使用する必要があります。Spring のプロキシベースの AOP は機能する可能性がありますが、Grails 2 コントローラー システムは特定のアノテーション (コンパイル時に AST 変換によって追加される) を持つアクション メソッドに依存しており、@ActionSpring AOP プロキシがターゲットからのメソッド アノテーションを保持するかどうかはわかりません。生成されたプロキシ メソッドのクラス。

于 2012-06-11T09:47:22.590 に答える
0

MyController.metaClass.invokeMethod定義後にgrailsフレームワークによって上書きされる可能性はありますか?

MyController.metaClass.invokeMethodリフレクションを通して内容を確認しようとしましたか?

于 2012-06-10T19:50:08.153 に答える