2014-01-13 120 views
1

我在Grails項目中有這樣的控制器:Grails領域構造沒有工作

def submit() { 
    def json = request.JSON 
    Share share = new Share(json) 
    share.save(flush: true, failOnError: true) 
} 

類股看起來是這樣的:

class Share { 

    String timestamp 
    String deviceName 
    String originMessage 

Share(JSONObject originalMessage) { 
    println "Run JSON constructor" 
    println "$originalMessage" 

    originMessage = originalMessage.toString() 
    timestamp = originalMessage.timestamp 
    deviceName = originalMessage.device 
} 

它收到
JSON請求,並嘗試在堅持數據庫。

我在控制檯得到failOnError這樣的錯誤:在對象

  • 場誤差現場「com.entity.Share」「設備名稱」:拒絕值[空]
  • 字段'originMessage'上的對象'com.entity.Share'中的字段錯誤:rejected value [null];代碼

大量的跳舞找到一種可能的方式:在控制器中將JSON轉換爲字符串並將其傳遞給構造函數,其中參數將是String類型,然後使用JSON轉換器將其解析爲JSON。但爲什麼我無法正確傳遞JSON對象作爲參數。怎麼了?

+1

刪除你的構造,並再次嘗試空。 Grails已經有了這樣的領域類的構造函數。 –

+0

是的,我知道,但我不喜歡構造函數的映射風格。然而,爲什麼我看到這樣奇怪的行爲? – sphinks

回答

2

我沒有在聲明這個構造函數時看到太多的觀點,因爲域類已經有一個隱含的構造函數,它的參數爲Map。您可以使用JSONObject調用此構造函數,因爲此類實現Map,例如,

class Share { 

    String timestamp 
    String deviceName 
    String originMessage 
} 

def json = request.JSON 
Share share = new Share(json) 

原因這些錯誤

Field error in object 'com.entity.Share' on field 'deviceName': rejected value [null]; 
Field error in object 'com.entity.Share' on field 'originMessage': rejected value [null]; codes 

是您JSONObject實例沒有命名deviceNameoriginMessage非空的屬性。

要麼你需要弄清楚爲什麼這些屬性缺失,或允許這些屬性中加入以下約束域類

class Share { 

    String timestamp 
    String deviceName 
    String originMessage 

    static constraints = { 
     deviceName nullable: true 
     originMessage nullable: true 
    } 
} 
+0

是的,我知道groovy中的默認構造函數。使用JSON有用的地圖樣式,但正如你可以看到originalMessage不只是字段,而是原始的JSON請求。當然,我仍然可以使用Map構造器枚舉所有帶有值的字段,但我也不喜歡Map風格,這就是爲什麼我創建了自己的構造器。關於錯誤的消息,是的,我看到它對我說的話和我的問題關於完全相同的原因爲什麼這種屬性在這種情況下失蹤,並在字符串的情況下工作完美? – sphinks