groovy 在grails 3.x域对象中使用traits和constraint

t1qtbnec  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(138)

有没有可能以某种方式创建一个带有字段和这些字段的约束的trait,然后创建实现该trait的域类并选择带有约束的字段?
我有一个代码,基本上看起来像:

trait Shared {
  String sharedField

  static constraints = {
    sharedField nullable: true
  }
}

class ImplementingClass implements Shared {
  ...
}

保存具有空sharedField的ImplementingClass示例将被拒绝,并违反约束。
有没有可能做到这一点?有没有一个替代的语法,需要使用约束和其他GORM结构在域对象实现的traits?

5sxhfpxr

5sxhfpxr1#

我也遇到了同样的问题,我查看了Grails的源代码并做了一些实验。
importFrom(Shared)将不工作,因为Grails通过clazz.getDeclaredFields()查找constraints字段,这将导致traits的空数组。
现在你有两个选择:
1.创建一个Java/Groovy类,它看起来像你的trait,但只包含属性和约束Map

class SharedConstraints {
    String sharedField
    
    static constraints = {
      sharedField nullable: true
    }
}

现在,您可以将SharedConstraintsimportFrom一起使用
1.为约束创建一个groovy脚本。此功能主要用于Java域类,但也可用于traits。
在同一个包中创建一个SharedConstraints.groovy:

constraints = {
    sharedField nullable: true
}

如果您使用IntelliJ和Grails 3.0(可能还有其他版本),则脚本必须放在resources文件夹中。如果您按照Grails文档中的描述将文件放在src/java文件夹中,则脚本将被编译,并且不会工作x1c 0d1x
还请注意此错误https://github.com/grails/grails-core/issues/10052

相关问题