向控制器添加方法

时间:2009-06-26 14:22:22

标签: grails metaprogramming

在Grails应用程序中,我想为所有控制器类添加一个foo()方法。我知道我可以使用以下代码在插件的doWithDynamicMethods闭包中执行此操作:

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

但是,我不想为此目的创建一个插件。还有其他地方我可以做到这一点。我怀疑它可能在init的{​​{1}}闭包内,但我不知道如何访问此闭包中的BootStrap.groovy实例。

谢谢, 唐

3 个答案:

答案 0 :(得分:2)

def grailsApplication = org.codehaus.groovy.grails.commons.ApplicationHolder.application

答案 1 :(得分:0)

很久以前就提出了这个问题,所以当时我的回答可能不可能 - 但现在是2014年4月。这段代码显示了向所有控制器添加方法的最简单方法(从{{1 }}):

BootStrap.init
  1. 在BootStrap.groovy中,像这样注入grailsApplication: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) } } }
  2. 拨打我上面的电话,替换您自己的电子邮箱名称 - 以避免搞乱插件类。
  3. 现在在任何控制器中你都可以使用def grailsApplication闭包(像方法一样调用它)。
  4. 请注意,这不会添加操作!这只是一个实用程序闭包/方法  控制器。

答案 2 :(得分:-2)

class BootStrap {
    def grailsApplication

    def init = { servletContext ->
        ...
    }
}
相关问题