@Enhances Grails 控制器

@Enhances Grails Controller

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

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

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

不,没有办法解决这个问题,因为 @Enhances classes 需要在编译前位于 class 路径上。例如,假设您的控制器 class 先编译,然后再编译您的特征,那么特征将不会被应用,并且由于无法控制编译顺序,这将仍然是一个问题。

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

How do I add a new sourceset to Gradle?

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

grails gradle 插件,默认情况下带有一个名为 ast 的源集,它在任何主源集之前被编译。所以你可以把你的特征放在 ast sourceset 中,即使在相同的 plugin/project.

中,它也会应用于人工制品

您的项目结构应如下所示

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

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

更新: Grails 仅为插件项目而不是应用程序配置 ast 源集。在这里,我写了一篇关于如何为应用程序

创建 AST sourceset 的博客条目