【问题标题】:Grails. How to handle the 'mixed' methods and variables when using @GrailsCompileStatic圣杯。使用@GrailsCompileStatic 时如何处理“混合”方法和变量
【发布时间】:2017-10-07 20:12:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java grails groovy static-compilation


    【解决方案1】:

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

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

    trait 兼容静态编译……​

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      LinkGenerator grailsLinkGenerator
      

      并从包grails.web.mapping导入类

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-12
        相关资源
        最近更新 更多