我正在覆盖我编写的每个控制器的重定向方法。我做到了,因为
a)我需要在实际执行重定向之前设置一些变量
b)我想在全球范围内这样做,因为每个控制器的代码都是相同的,我想要干掉
我在引导程序中执行了此操作,因为它是在服务器启动时执行的。
代码:
grailsApplication.controllerClasses.each() { controllerClass ->
if (controllerClass.fullName.startsWith("my.package")){
def oldRedirect = controllerClass.metaClass.pickMethod("redirect", [Map] as Class[])
controllerClass.metaClass.redirect = { Map args ->
// pre-redirect logic
args.put("some", "property")
oldRedirect.invoke delegate, args
// post-redirect logic
}
}
}
问题在于:
当我开发时,我使用重新加载功能/只是及时编译器,它重新编译文件而无需重新启动服务器。在这种情况下,重建控制器,结果重写的重定向方法丢失。
以下是问题:
是否有回调/另一种方法来查明何时在运行时重新编译类?我想检查控制器是否重建,然后再次覆盖重定向方法!
答案 0 :(得分:1)
是的,将此功能分解为插件,然后您可以观察重新加载类并重新应用更改。 documentation详细介绍了参与自动重装事件的情况。
这将是实现您所期望的最干净,最恰当的方式。