为什么@GrailsCompileStatic允许调用动态GORM查找程序但不允许调用domainClass.withTransaction()?

时间:2016-05-09 22:25:26

标签: grails annotations grails-2.5

@GrailsCompileStatic 注释添加到方法或类允许使用动态GORM查找器,例如: findAllByIdAndProperty()的。 但是,添加注释不允许 domainClass.withTransaction(),这也是GORM AST的添加。为什么呢?

(使用grails-2.5.3)

更新(2016年10月5日 - 上午10:25) @ jeff-scott-brown是对的,它确实有效,所以这里是 @GrailsCompileStatic 失败的代码:

...
RestfulApiService service = ServiceUtils.getService(resourceName)
service.resourceClass.withTransaction { /* do something */ }

resourceClass 的类型为Class)

错误:

Compilation error: startup failed:
C:\...\myfile.groovy: 100: [Static type checking] - Cannot find matching method java.lang.Class#withTransaction(groovy.lang.Closure). Please check if the declared type is right and if the method exists.
@ line 100, column 13.
           service.resourceClass.withTransaction {
           ^

为什么在添加注释后 withTransaction()会失败?

1 个答案:

答案 0 :(得分:0)

  

为什么@GrailsCompileStatic允许调用动态GORM查找器,但是   不是domainClass.withTransaction()?

确实如此。 https://github.com/jeffbrown/withtx/blob/master/grails-app/controllers/demo/DemoController.groovy处的代码编译。

import grails.compiler.GrailsCompileStatic

@GrailsCompileStatic
class DemoController {

    def index() {
        Person.withTransaction {
            // ...
        }
        render 'Success!'
    }
}