控制器在运行时重新编译时的 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 详细介绍了如何参与自动充值活动。

这将是完成您想要做的事情的最干净、最合适的方法。