【问题标题】:@Enhances Grails Controller@Enhances Grails 控制器
【发布时间】:2016-07-13 17:02:50
【问题描述】:

我有一个这样定义的特征:

@Enhances(ControllerArtefactHandler.TYPE)
trait NullCheckTrait {
   def nullCheck(def object) {
      // code here
   }
}

当我从控制器调用nullCheck(foo) 时,我得到No signature of method 异常。如果我在控制器上implements NullCheckTrait,它工作正常。我读过@Enhances 只有在我创建一个 grails 插件并将特征放在那里时才能工作。我很好奇这是否是一个已知问题,以及是否有办法让@Enhances 在与控制器相同的 grails 应用程序中工作。

【问题讨论】:

    标签: grails controller traits


    【解决方案1】:

    没有办法解决这个问题,因为@Enhances 类需要在编译之前位于类路径中。例如,假设您的控制器类先编译,然后再编译您的 trait,则不会应用 trait,并且由于无法控制编译顺序,这仍然是一个问题。

    可以在同一个项目中完成此操作的唯一其他方法是在 Gradle 中设置额外的源集,请参阅:

    How do I add a new sourceset to Gradle?

    【讨论】:

    • 谢谢格雷姆。这完全有道理。并且,感谢您的链接。
    • @Graeme Rocher 这仍然有效吗?已经有一个 ast 源集,即使在同一个项目中,将转换放在 src/ast 下也可以工作,而不需要仅为 AST 提供额外的插件,请参阅下面的答案
    【解决方案2】:

    还有一种解决方案不需要您创建自定义的附加源集。

    grails gradle 插件,默认情况下带有一个名为 ast 的源集,它在任何主源集之前编译。这样您就可以将您的 Trait 放入 ast 源集中,即使在同一个插件/项目中,它也会应用于人工制品。

    你的项目结构应该是这样的

     src
      +
      +--+ast
            +
            +--+groovy
                     +
                     +--+MyAwsomeTrait.groovy
    

    这将在 src/main sourceset 中的类之前编译,grails 将选择您的源集并应用它。

    更新: Grails 仅为插件项目而非应用程序配置 ast 源集。这里我写了一篇关于如何为应用创建AST sourceset的博文

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多