Grails Domain Constructor不是Groovy构造函数

Ami*_*.io 1 grails groovy constructor

执行这种代码的和平

class DefObject{
  String a
  def b
}

def c = new DefObject(a:1, b:2);
Run Code Online (Sandbox Code Playgroud)

在Grails和Groovy中产生不同的结果.

Groovy的

assert c.a == 1
assert c.b == 2 
Run Code Online (Sandbox Code Playgroud)

Grails Domain Class

assert c.a == 1 
assert c.b == null
Run Code Online (Sandbox Code Playgroud)

如何让Grails Domain接受值b

Bur*_*ith 5

这是因为在域类中,只能通过映射构造函数设置"可绑定"属性.您可以覆盖属性是否可绑定(例如,id属性不是出于安全原因,但如果您知道自己在做什么,则可以将其配置为).

类似的无类型属性b不是持久的,因为GORM/Hibernate无法知道如何使用def或者指定数据Object.所以它们不可绑定,因为它们不是持久性的,并且它们被定制的地图构造函数忽略了.

由于其他原因,这是一个方便的功能,例如,它允许new DefObject(params)在不抱怨params地图中与域类中的属性不对应的查询参数的情况下工作,例如controlleraction.使用Groovy构造函数,如果您对映射中的值不对应于类属性,groovy.lang.MissingPropertyException则抛出a但在域类中忽略这些值.