Добавить методы в контроллеры - PullRequest
0 голосов
/ 26 июня 2009

В приложении Grails я хотел бы добавить метод foo () ко всем моим классам контроллеров. Я знаю, что могу сделать это внутри закрытия плагина doWithDynamicMethods, используя такой код:

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

Однако я не хочу создавать плагин только для этой цели. Где-нибудь еще я могу сделать это? Я подозреваю, что это возможно в закрытии init из BootStrap.groovy, но я не знаю, как получить доступ к экземпляру GrailsApplication в этом закрытии.

Спасибо, Don

Ответы [ 3 ]

2 голосов
/ 26 июня 2009
def grailsApplication = org.codehaus.groovy.grails.commons.ApplicationHolder.application
0 голосов
/ 06 апреля 2014

Вопрос задавался очень давно, поэтому мой ответ мог быть невозможен тогда - но сейчас апрель 2014 года. Этот код показывает наиболее простой способ добавления метода ко всем вашим контроллерам (изнутри 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. В BootStrap.groovy, введите GrailsApplication так: def grailsApplication
  2. Сделайте вызов, подобный моему выше, подставив собственное имя пакета - чтобы не возиться с классами плагинов.
  3. Теперь в любом контроллере вы можете использовать закрытие repondError (вызывать его как метод).

Обратите внимание, что это не добавляет действие! Это просто утилита закрытия / метод, доступный в каждом контроллер.

0 голосов
/ 15 октября 2013
class BootStrap {
    def grailsApplication

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