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が原因で、またサービスが常にリロードされるため、機能しません。誰かがこれを私にもっとよく説明できますか?
前もって感謝します。