2017-04-21 114 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