在我最新的 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
部分找到另一个错误处理,直到问题得到解决?
有什么建议么?