使用grails 3.x域对象的特征和约束

Jos*_*ing 5 grails groovy grails-orm

是否有可能以某种方式为这些字段创建具有字段和约束的特征,然后创建实现该特征的域类并使用约束来获取字段?

我的代码基本上看起来像:

trait Shared {
  String sharedField

  static constraints = {
    sharedField nullable: true
  }
}

class ImplementingClass implements Shared {
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后,使用null sharedField保存一个ImplementingClass实例,但会违反约束.

是否有可能做到这一点?是否存在在域对象实现的特征中使用约束和其他GORM构造所需的替代语法?

And*_*eas 2

我也遇到了同样的问题,我查看了Grails的源代码并做了一些实验。

importFrom(Shared)不会起作用,因为 Grails 会constraints通过clazz.getDeclaredFields()导致特征空数组的结果来查找字段。

现在你有两个选择:

  1. 创建一个看起来像您的特质的 Java/Groovy 类,但仅包含属性和约束映射
class SharedConstraints {
    String sharedField
    
    static constraints = {
      sharedField nullable: true
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以SharedConstraints使用importFrom

  1. 为约束创建一个常规脚本。此功能主要用于 Java 域类,但也可用于特征。

在同一包中创建 SharedConstraints.groovy:

constraints = {
    sharedField nullable: true
}
Run Code Online (Sandbox Code Playgroud)

如果您将 IntelliJ 与 Grails 3.0(也可能是其他版本)一起使用,则必须将脚本放置在 resources 文件夹中。如果按照 Grails 文档中的描述将该文件放置在 src/java 文件夹中,则该脚本将被编译并且将无法运行智能截图

另请注意此错误https://github.com/grails/grails-core/issues/10052