我试图覆盖默认的控制器重定向方法,似乎无法使下面的代码工作。
我创建了一个插件,我正在尝试使用“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”但是它没有一旦应用程序启动,通过控制器进行重定向时,请进入那里。
答案 0 :(得分:3)
是的,签名是错误的 - 重定向需要一个Map
参数(参见org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin.registerControllerMethods()
中的声明)
所以它应该是
controllerClass.metaClass.redirect = { Map args ->
// pre-redirect logic
oldRedirect.invoke delegate, args
// post-redirect logic
}
答案 1 :(得分:0)
另请注意,如果您希望在修改控制器的源代码后重新应用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))
}
}