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

时间:2015-04-30 21:49:49

标签: grails groovy gorm

是否有可能以某种方式为这些字段创建包含字段和约束的特征,然后创建实现该特征的域类并选择具有约束的字段?

我的代码基本上是这样的:

trait Shared {
  String sharedField

  static constraints = {
    sharedField nullable: true
  }
}

class ImplementingClass implements Shared {
  ...
}

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

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

1 个答案:

答案 0 :(得分:1)

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

importFrom(Shared)无效,因为Grails通过constraints查找clazz.getDeclaredFields()字段会导致特征为空数组。

现在您有两个选择:

1)制作一个看起来像你的特征的Java / Groovy类,但只包含属性和约束图

class SharedConstraints {
    String sharedField

    static constraints = {
      sharedField nullable: true
    }
}

现在,您可以将SharedConstraintsimportFrom

一起使用

2)为约束创建一个groovy脚本(http://docs.grails.org/latest/guide/hibernate.html#addingConstraints)。此功能主要用于Java域类,但也可用于特征。

在同一个包中创建SharedConstraints.groovy:

constraints = {
    sharedField nullable: true
}

如果您将IntelliJ与Grails 3.0一起使用(也可能是其他版本),则必须将脚本放在resources文件夹中。如果您将文件放在sils / java文件夹中,如Grails文档中所述,脚本将被编译,并且无法正常工作intelliJ screenshot

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