“Grails动态”;inList";

“Grails动态”;inList";,grails,grails3,Grails,Grails3,这几乎与这个老问题相同:这个问题基本上没有得到解决,也许在提出这一问题后的几年里取得了进展 我想用另一个域的值填充域属性的inList参数。由于自动生成的视图(scaffolding、filterpane),这需要来自inList,而不是自定义验证器 class MyDomain { String someValue static constraints = { someValue(nullable: true, maxSize: 50, inList: SomeOtherDom

这几乎与这个老问题相同:这个问题基本上没有得到解决,也许在提出这一问题后的几年里取得了进展

我想用另一个域的值填充域属性的
inList
参数。由于自动生成的视图(scaffolding、filterpane),这需要来自
inList
,而不是自定义验证器

class MyDomain {
  String someValue
  static constraints = {
    someValue(nullable: true, maxSize: 50, inList: SomeOtherDomain.list()*.name)
  }
}
这会在启动时产生以下错误:

原因:java.lang.IllegalStateException:类[thepackage.SomeOtherDomain]不是域类,或者GORM未正确初始化或已关闭。在调用GORM实体上的任何方法之前,确保正确加载和配置GORM。


我知道,处理这个问题的“正确”方法是将
someValue
作为
SomeOtherDomain
的一个实例,而不是仅仅存储名称,但这不太合适。我们希望能够删除
SomeOtherDomain
的实例,而不破坏所属域的保存值。。。具有已删除值的域今后将无效,并且在保存之前必须更新,但存档/锁定的记录仍将存在并可以显示。

您可以为filterpane指定如下值列表:

<filterpane:filterPane domain="MyObject" filterPropertyValues="${['someValue':[values: SomeOtherDomain.list().collect{it.name}]]}" />

然后使用自定义验证器进行实际验证。我不确定什么样的脚手架可能会使用inList,但如果你同意用静态页面替换一些脚手架页面,那么就可以很容易地绕过它