0

我渴望@GrailsCompileStatic在我的 grails 3.1.7 应用程序的许多地方使用注释。但主要问题是它没有考虑到域、命令和控制器与其他方法(如save()or validate())或变量(如g)“混合”。

我找到了上述方法的解决方法:我从具有空save()方法的抽象类继承域和命令(它的实现随后被 grails 覆盖,但静态编译不会失败)。这个抽象类也通过方法实现来实现grails.validation.Validateable特征。validate()

但是有没有更好的方法来启用静态编译而没有这些肮脏的技巧?

在许多控制器中,我使用该g.createLink()方法。在静态编译期间,我应该如何g在内部传递变量以避免这种情况?

错误:(37, 39) Groovyc: [静态类型检查] - 变量 [g] 未声明。

4

2 回答 2

0

补充@andi 回答的内容,只是为g.createLink()问题添加解决方案:
您可以注入LinkGeneratorbean 并根据需要使用静态编译。

注意:您必须像这样注入依赖项:

LinkGenerator grailsLinkGenerator

并从包中导入类grails.web.mapping

于 2017-05-09T23:30:48.417 回答
0

AFAIK,@GrailsCompileStatic 已经允许您使用像 save() 这样的方法。就我而言,这只是 groovy eclipse 插件的问题,而 grails run-app 工作正常。

无论如何,从 grails 3 开始,特征提供的方法可以通过直接“实现”特征来访问,如此处所述

trait 与静态编译兼容……​</p>

class TestController implements Controller {
        @GrailsCompileStatic
        def index() {
            render "test"
        }
    }

g 似乎是 NamespacedTagDispatcher 类型,它使用 methodMissing 在运行时查找调用的方法。即使您可以在编译时访问 g,g.createLink() 也不会编译。

您可以将性能关键代码提取到另一个方法中并使用 @CompileStatic 对其进行注释,或者编写一个调用 g.createLink() 的未注释方法

于 2017-05-09T21:09:07.537 回答