我很想在我的grails 3.1.7应用程序的许多地方使用@GrailsCompileStatic
注释。但主要问题是它没有考虑到域,命令和控制器与其他方法(如save()
或validate()
)或变量(如g
)“混合”
我找到了上述方法的解决方法:我从具有空save()
方法的抽象类继承域和命令(它的实现被grails覆盖,但静态编译不会失败)。此抽象类还使用grails.validation.Validateable
方法实现实现validate()
trait。
但是没有更好的方法可以在没有这些肮脏技巧的情况下启用静态编译吗?
在许多控制器中,我使用g.createLink()
方法。如何在静态编译期间将g
变量传递到内部以避免这种情况?
错误:(37,39)Groovyc:[静态类型检查] - 变量[g]是 未申报。
答案 0 :(得分:0)
AFAIK,@ GrailsCompileStatic已经允许你使用save()等方法。 在我的情况下,它只是一个groovy eclipse插件的问题,而grails run-app工作正常。
无论如何,由于grails 3,traits提供的方法可以通过直接“实现”特征来访问here
这些特征与静态编译兼容......
class TestController implements Controller {
@GrailsCompileStatic
def index() {
render "test"
}
}
g似乎是NamespacedTagDispatcher类型,它使用methodMissing在运行时查找被调用的方法。即使您获得g的编译时访问权限,g.createLink()也无法编译。
您可以将性能关键代码提取到另一个方法中并使用@CompileStatic注释它,或者编写一个调用g.createLink()的未注释方法
答案 1 :(得分:0)
补充@andi回答的内容,只是为g.createLink()
问题添加解决方案:
您可以注入LinkGenerator
bean并根据需要使用静态编译。
注意:你必须像这样注入依赖:
LinkGenerator grailsLinkGenerator
从包grails.web.mapping