Grailsは/ Groovyでメソッド呼び出しをインターセプトまたは名前変更
-
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のと動作しないでしょうから。誰かが私にこれをよりよく説明できますか?
事前に感謝します。
解決
私はあなたが古いメソッドの名前を変更する必要はないと思います。あなたは<のように、この例でそれを行うことができます/ A>:
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が正しい方法を返すことを確認してください。
所属していません StackOverflow