2
我試圖在Grails應用程序中攔截方法調用(域類的afterInsert())。在我的插件的doWithDynamicMethods關閉我:在Grails/Groovy中攔截或重命名方法調用
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]),但後來我得到:
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並不會工作,並且因爲服務總是被重新加載。有人能更好地向我解釋這一點嗎?
在此先感謝。