在我最新的 grails 2.3.0 项目中,我使用@Mixin注释来混合一个辅助类以保持我的controller更多 DRY。
如果在控制器中进行了一些更改以强制重新编译控制器,则 mixin 正在工作。在初始编译(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
}
}
}
并且(其中一个)controller使用ProjectHelper:
@Mixin(ProjectHelper)
class ProjectController {
def index() {
withProject params.projectId, {project ->
// do something with the project
}
}
}
当我使用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]
在进行一些更改ReportController(例如添加一个空格)后,grails 会编译 2 个源文件,并且withProject可以使用该方法。访问project/index按预期工作。
这里出了什么问题?这是一个错误还是我错过了什么?
更新
事实证明,我完全错过了,使用grails.util.Mixin给我另一个异常 ( MissingPropertyException) 由于缺少对混合类属性的访问权限(在我的情况下:flash)(请参阅JIRA 这个问题)正在使用groovy.lang.Mixin(重新编译后)。
有没有办法groovy.lang.Mixin在运行时手动重新编译/注入/混合,或者我必须为该else部分找到另一个错误处理,直到问题得到解决?
有什么建议么?