元のメソッドが完了した後に別のメソッド (同じサービス内ではない) を呼び出す grails-services メソッドへのすべてのメソッド呼び出しをインターセプトするプラグインを作成しました。
doWithDynamicMethods に次のコードを追加しました。
for (serviceClass in application.serviceClasses){
serviceClass.metaClass.invokeMethod = { String name, args ->
//execute the original method
def metaMethod = delegate.metaClass.getMetaMethod(name, args)
def result = metaMethod.invoke(delegate, args)
//execute additional method on other bean
def otherbean.doSomething(Object object)
return result
}
}
すべてが機能し、otherbean.doSomething() が毎回呼び出されますが、otherbean.doSomething() によって例外がスローされた場合、元のメソッドで行われたデータベースの変更はロールバックではないことに気付きます。
トランザクションのスコープは元のメソッドのみをカバーし、元のメソッドの呼び出しが完了するとすぐにコミットされるようです。
元のメソッドと追加のメソッドを同じトランザクションで実行する方法はありますか?
注: otherbean は grails サービスではありません