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

问题描述 投票:0回答:2

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

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

trait Shared {
  String sharedField

  static constraints = {
    sharedField nullable: true
  }
}

class ImplementingClass implements Shared {
  ...
}

使用空共享字段保存 ImplementingClass 实例会因违反约束而被拒绝。

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

grails groovy grails-orm
2个回答
2
投票

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

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

现在您有两个选择:

  1. 创建一个看起来像你的特质的 Java/Groovy 类,但只包含属性和约束映射
class SharedConstraints {
    String sharedField
    
    static constraints = {
      sharedField nullable: true
    }
}

现在您可以将

SharedConstraints
importFrom

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

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

constraints = {
    sharedField nullable: true
}

如果您将 IntelliJ 与 Grails 3.0(也许还有其他版本)一起使用,则必须将脚本放置在 resources 文件夹中。如果您按照 Grails 文档中的说明将该文件放置在 src/java 文件夹中,则该脚本将被编译并且将无法工作

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


0
投票

我所做的是创建一个特征和一个类来提供约束。 这可以很容易地扩展为让

Product
类实现多个特征和相关约束......

class Product implements FormatsTrait {
    static constraints {
        importFrom FormatsConstraints
    }
}

trait FormatsTrait {
    String formats
}

class FormatsConstraints implements FormatsTrait {
    static constraints {
        formats nullable:true
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.