Grailsは/ Groovyでメソッド呼び出しをインターセプトまたは名前変更

StackOverflow https://stackoverflow.com/questions/2379324

  •  24-09-2019
  •  | 
  •  

質問

私は、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(デリゲート、新しいオブジェクト[0])が、その後I GET:ます。

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について知っているし、また例として、Grailsの監査ログのプラグインを見てきました。しかし、何であるかそれがない、私の知る限り、適切なタイミングでトリガーを取得新しいユーザが作成したメソッドを追加します。私は何も心配することは、自動的にユーザーが持っていないというのが私のコードを挿入したいと私は)(彼の元afterInsertを破壊したくない(または、それが何であれ方法)実装ます。

また、私はそれらの中に注入保障するために、公開されたサービス・メソッドのために同じことをしたいと思います。しかし、私が読んだことがあるため、サービスが常に再ロードされているのでBeanWrapperのと動作しないでしょうから。誰かが私にこれをよりよく説明できますか?

事前に感謝します。

scroll top