метод переопределения перенаправления grails - PullRequest
5 голосов
/ 15 марта 2011

Я пытаюсь переопределить метод перенаправления контроллера по умолчанию и, похоже, не могу заставить работать следующий бит кода.

Я создал плагин и пытаюсь использовать doWithDynamicMethods для заменыперенаправление.

def doWithDynamicMethods = {ctx ->
   application.controllerClasses.each() { controllerClass ->
      replaceRedirectMethod(controllerClass)
   }
}

void replaceRedirectMethod(controllerClass) {
   def oldRedirect = controllerClass.metaClass.pickMethod("redirect", [Map] as Class[])
   controllerClass.metaClass.redirect = { Map args, Map params ->
      // never seems to get here    
   }
}

У меня неверная подпись или я что-то упустил?Причина, по которой я это делаю, заключается в том, что я хотел бы изменить URI перенаправления, если определенное условие выполнено, но с помощью инструкций logging / print я вижу, что он запускается в «replaceRedirectMethod» при запуске / компиляции приложения, но это нене переходите туда при перенаправлении через контроллер после запуска приложения.

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Да, подпись неверна - перенаправление принимает один параметр Map (см. Объявление в org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin.registerControllerMethods())

Так и должно быть

controllerClass.metaClass.redirect = { Map args ->
   // pre-redirect logic
   oldRedirect.invoke delegate, args
   // post-redirect logic
}
0 голосов
/ 04 сентября 2013

Также обратите внимание, что если вы хотите, чтобы переопределение метода redirect было повторно применено после изменения исходного кода контроллера, вам необходимо сделать следующее:

def watchedResources = [
  "file:./grails-app/controllers/**/*Controller.groovy"]

def onChange = { event ->
  if(!(event.source instanceof Class)) return

  if(application.isArtefactOfType(ControllerArtefactHandler.TYPE, event.source))
  {
    replaceRedirectMethod(application.getArtefact(ControllerArtefactHandler.TYPE,
                                                  event.source.name))
  }
}
...