执行这种代码和平
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
的值?
答案 0 :(得分:5)
这是因为在域类中,只有"可绑定"可以通过地图构造函数设置属性。您可以覆盖属性是否可绑定(例如id
属性不是出于安全原因,但如果您知道自己正在做什么,则可以将其配置为。)
像b
这样的无类型属性不是永久性的,因为GORM / Hibernate无法知道如何使用def
或Object
指定数据。因此,它们不具有可绑定性,因为它们不会持久,并且它们会被自定义地图构造函数忽略。
由于其他原因,这是一个方便的功能,例如它允许new DefObject(params)
工作,而不会抱怨params
地图中与域类中的属性不对应的查询参数,例如controller
和action
。使用Groovy构造函数,如果您对映射中的值与类属性没有对应的值,则抛出groovy.lang.MissingPropertyException
但在域类中忽略这些值。