我正在尝试覆盖默认的 Controller 重定向方法,并且似乎无法使以下代码起作用。

我已经创建了一个插件,并且尝试使用“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,但是对于日志记录/打印语句,我看到它在应用程序启动/编译时进入“replaceRedirectMethod”中,但它没有应用启动后,通过 Controller 进行重定向时,请不要进入该目录。

最佳答案

是的,签名是错误的-重定向使用单个Map参数(请参阅org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin.registerControllerMethods()中的声明)

所以应该

controllerClass.metaClass.redirect = { Map args ->
   // pre-redirect logic
   oldRedirect.invoke delegate, args
   // post-redirect logic
}

关于grails覆盖重定向 Controller 方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5316727/

10-13 04:08