控制器在运行时重新编译时的 grails 回调
grails callback when controller recompiled in runtime
我正在覆盖我编写的每个控制器的重定向方法。我这样做是因为
a) 我需要在实际执行重定向之前设置一些变量
b) 我想在全球范围内这样做,因为它对每个控制器都是相同的代码,我想成为 DRY
我在 bootstrap 中做了这个,因为它是在服务器启动时执行的。
代码:
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
}
}
}
问题是:
当我开发时,我使用重新加载功能/即时编译器重新编译文件而无需重新启动服务器。在这种情况下,控制器被重建,结果被覆盖的重定向方法丢失了。
这里是问题:
是否有回调/另一种方法来找出 class 何时在运行时重新编译?我很想检查控制器是否重建,然后再次覆盖重定向方法!
是的,将此功能分解为一个插件,然后您可以观察 类 的重新加载并重新应用您的更改。 documentation 详细介绍了如何参与自动充值活动。
这将是完成您想要做的事情的最干净、最合适的方法。
我正在覆盖我编写的每个控制器的重定向方法。我这样做是因为
a) 我需要在实际执行重定向之前设置一些变量
b) 我想在全球范围内这样做,因为它对每个控制器都是相同的代码,我想成为 DRY
我在 bootstrap 中做了这个,因为它是在服务器启动时执行的。
代码:
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
}
}
}
问题是:
当我开发时,我使用重新加载功能/即时编译器重新编译文件而无需重新启动服务器。在这种情况下,控制器被重建,结果被覆盖的重定向方法丢失了。
这里是问题:
是否有回调/另一种方法来找出 class 何时在运行时重新编译?我很想检查控制器是否重建,然后再次覆盖重定向方法!
是的,将此功能分解为一个插件,然后您可以观察 类 的重新加载并重新应用您的更改。 documentation 详细介绍了如何参与自动充值活动。
这将是完成您想要做的事情的最干净、最合适的方法。