Grails Domain Constructor不是Groovy构造函数

时间:2017-04-21 14:21:40

标签: grails groovy constructor

执行这种代码和平

class DefObject{
  String a
  def b
}

def c = new DefObject(a:1, b:2);

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

Groovy的

assert c.a == 1
assert c.b == 2 

Grails Domain Class

assert c.a == 1 
assert c.b == null

如何让Grails Domain接受b的值?

1 个答案:

答案 0 :(得分:5)

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

b这样的无类型属性不是永久性的,因为GORM / Hibernate无法知道如何使用defObject指定数据。因此,它们不具有可绑定性,因为它们不会持久,并且它们会被自定义地图构造函数忽略。

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