2009-06-26 90 views
0

在Grails應用程序中,我想爲所有控制器類添加foo()方法。我知道我可以使用類似的代碼做一個插件的doWithDynamicMethods閉包:向控制器添加方法

application.controllerClasses.toList()*.metaClass*.foo = { println 'foo called' } 

不過,我不希望創建一個插件只是爲了這個目的。有沒有其他地方我可以做到這一點。我懷疑可能在init關閉BootStrap.groovy之內,但我不知道如何訪問GrailsApplication實例。

謝謝, 唐

+0

爲什麼不寫一個插件?這是插件用例的完美類型。你不必釋放它,也不必是一個大插件。 通過插件模塊化應用程序是一個偉大的Grails成語,你應該遵循,如果你可以。 – Chii 2009-07-08 13:36:10

回答

2
def grailsApplication = org.codehaus.groovy.grails.commons.ApplicationHolder.application 
-2
class BootStrap { 
    def grailsApplication 

    def init = { servletContext -> 
     ... 
    } 
} 
+1

這是什麼意思? – dmahapatro 2013-10-15 00:24:08

0

有人問很久以前,所以我的回答可能就沒有可能當時 - 但現在是2014年4月這段代碼顯示了最直接加入所有的控制器的方法(從內BootStrap.init)的方式:

grailsApplication.controllerClasses.each { controllerClass -> 
    if (controllerClass.clazz.name.contains("org.idurkan.foo")) { 
     controllerClass.metaClass.respondError = { String message, int status = 404 -> 
      response.status = status 
      render([errorMessage: message] as JSON) 
     } 
    } 
} 
  1. 在BootSt rap.groovy,像這樣注入grailsApplication:def grailsApplication
  2. 在上面打一個類似於我的調用,替換你自己的包名 - 避免搞亂插件的類。
  3. 現在在任何控制器中,您都可以使用repondError閉包(像調用方法一樣調用它)。

請注意,這不會添加任何操作!這只是在每個 控制器中提供的實用閉合/方法。