Controller @Mixin在重新编译运行应用程序后才能正常工作

aio*_*los 6 grails groovy mixins

在我最新的grails 2.3.0项目中,我正在使用@Mixin注释混合一个帮助类来保持我的controller更干.

如果在控制器内进行一些更改以强制重新编译控制器,则mixin正在工作.在初始compile(grails run-app)之后,助手没有混入 - 我MissingMethodException试图从助手类访问一个方法.

这是我的助手src/groovy:

class ProjectHelper {
    def withProject(id, Closure c) {
        def project = Project.get(id)
        if (project) {
            c.call project
        } else {
            flash.message = 'Project not found!'
            render view: 'myView'
            return
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和(其中一个)controller使用ProjectHelper:

@Mixin(ProjectHelper)
class ProjectController {
    def index() {
        withProject params.projectId, {project ->
            // do something with the project
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用grails clean并启动应用程序清理项目时,访问后出现以下错误project/index:

MissingMethodException occurred when processing request: 
    [GET] /<myApp>/project/
    No signature of method: <myPackage>.withProject() is applicable for argument types: 
    (java.lang.String, <myPackage>.ProjectController$_index_closure1_closure10) values: 
    [1, <myPackage>.ProjectController$_index_closure1_closure10@40d889b5]
Run Code Online (Sandbox Code Playgroud)

在进行一些更改ReportController(例如添加单个空格)之后,grails会编译2个源文件,并且withProject可以使用该方法.访问project/index按预期工作.

这里出了什么问题?这是一个错误还是我错过了什么?

更新

事实证明,我完全错过了,因为缺少对类混合的属性(在我的情况下: )(参见JIRA这个问题)的访问权限(在重新编译之后),因此使用了grails.util.Mixin另一个异常().MissingPropertyExceptionflashgroovy.lang.Mixin

有没有办法groovy.lang.Mixin在运行时手动重新编译/注入/混合,或者我必须找到该else部件的另一个错误处理,直到问题得到解决?

有什么建议?

jst*_*ker 2

MissingMethodException当我使用 mixin 遵循类似的代码重用模式时,我经常遇到同样的情况。

就我而言,更改groovy.lang.Mixingrails.util.Mixin(或更具体地说,向我的控制器添加导入grails.util.Mixin)完全解决了问题。

至于无法访问控制器变量,您可能会陷入等待GRAILS-9905解决的困境。我应该注意到,缺陷讨论中列出了一些建议的解决方法。