6

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

有什么建议么?

4

2 回答 2

2

MissingMethodException在使用 mixins 遵循类似的代码重用模式时,我经常遇到同样的问题。

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

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

于 2014-02-07T17:04:11.823 回答
1

最终对我有用的解决方法是Mixin在 Controller 构造函数中手动注入:

import com.example.MyMixin

class SomethingController {
  def SomethingController() {
    SomethingController.metaClass.mixin(MyMixin)
  }
}
于 2014-04-02T16:15:10.567 回答