2017-04-21 113 views
1

执行这项和平的代码Grails领域构造不Groovy的构造

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领域类

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

我怎样才能让Grails领域接受b值?

回答

5

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

b这样的非类型属性并不是持久的,因为如果仅使用defObject指定,GORM/Hibernate无法知道如何存储数据。所以它们不可绑定,因为它们不是持久的,并且它们被自定义映射构造函数忽略。

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

+0

谢谢,伯特,很高兴知道。这使我在这个问题上的意图变得复杂 - http://stackoverflow.com/questions/43544783/adapt-field-to-store-to-database。 – zatziky