我试图在 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,并且还以 Grails Audit Logging 插件为例。但是,据我所知,它的作用是添加新的用户创建的方法,这些方法会在正确的时间触发。我想自动注入我的代码,这样用户就不必担心任何事情,我不想破坏他原来的 afterInsert() (或任何方法)实现。
另外,我想对暴露的服务方法做同样的事情,以便为它们注入安全性。但是,从我读到的内容来看,由于 BeanWrapper 并且服务总是重新加载,因此它不起作用。有人可以向我更好地解释一下吗?
提前致谢。