@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 的博客条目
我有一个这样定义的特征:
@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 的博客条目