2

Grailsアプリケーションでメソッド呼び出し(ドメインクラスのafterInsert())をインターセプトしようとしています。プラグインのdoWithDynamicMethodsクロージャーには、次のものがあります。

for (dc in application.domainClasses) {
    // What I'm basically doing is renaming method A to B
    // and creating a new method A with its own business logic
    // and a call to B() at the end

    def domainClass = dc.getClazz()
    def oldAfterInsert = domainClass.metaClass.afterInsert
    domainClass.metaClass."afterInsert_old" = oldAfterInsert

    dc.metaClass.afterInsert = {
        // New afterInsert() logic here

        // Call the old after insert
        delegate.afterInsert_old()
    }

}

しかし、次のエラーが発生します。

No signature of method: static com.example.afterInsert_old() is applicable for argument types: () values: []

また、dc.metaClass。 "afterInsert_old" .invoke(delegate、new Object [0])を使用して呼び出しようとしましたが、次のようになります。

Caused by: groovy.lang.MissingMethodException: No signature of method: groovy.lang.ExpandoMetaClass$ExpandoMetaProperty.invoke() is applicable for argument types: (com.example.DomainName, [Ljava.lang.Object;) values: [com.example.DomainName : 115, []]

私は何が間違っているのですか?引数を取らないメソッドを呼び出すにはどうすればよいですか?

私はAOPについて知っており、例としてGrailsAuditLoggingプラグインも見てきました。ただし、私が知る限り、適切なタイミングでトリガーされる新しいユーザー作成メソッドを追加します。ユーザーが何も心配する必要がなく、元のafterInsert()(またはそれがどのようなメソッドでも)の実装を破棄したくないように、コードを自動的に挿入したいと思います。

また、公開されているサービスメソッドにもセキュリティを注入するために同じことをしたいと思います。ただし、私が読んだところによると、BeanWrapperが原因で、またサービスが常にリロードされるため、機能しません。誰かがこれを私にもっとよく説明できますか?

前もって感謝します。

4

1 に答える 1

3

古いメソッドの名前を変更する必要はないと思います。あなたはこの例のようにそれをすることができます:

for (dc in application.domainClasses) {
    // What I'm basically doing is renaming method A to B
    // and creating a new method A with its own business logic
    // and a call to B() at the end
    def domainClass = dc.getClazz()
    def savedAfterInsert = domainClass.metaClass.getMetaMethod('afterInsert', [] as Class[])
    domainClass.metaClass.afterInsert = {
        // New afterInsert() logic here

        // Call the old after insert
        savedAfterInsert.invoke(delegate)
    }

}

getMetaMethodが正しいメソッドを返すことを確認してください。

于 2010-03-04T13:29:35.833 に答える