2011-01-21 51 views
14

我剛剛開始使用Grails,這是第一個問題。爲什麼Grails在域對象保存時沒有通知我錯誤?

我花了幾個小時才發現域對象無法插入數據庫,直到其所有屬性都被填充。

class Item { 
    String title 
    String link 
} 

class ItemController { 
    def fetch = { 
    def item = new Item() 
    item.title = "blabla" 
    // no value for "link" 
    item.save() 
    } 
} 

看起來合乎邏輯,但爲什麼它會被這麼默默地跳過?在這種情況下,我可以配置什麼來獲取異常嗎?

感謝

回答

29

默認情況下不引發異常。

如果在驗證階段發生錯誤,則注入域類的save()方法返回false。 檢查保存域類的/更新一個經典的代碼示例是:

if (!myDomainObj.save()) { 
    log.warn myDomainObj.errors.allErrors.join(' \n') //each error is an instance of org.springframework.validation.FieldError  
} 

如果您需要有一個特定的領域類的異常,請使用:

myDomainObj.save(failOnError: true) 

與例外的驗證失敗將被拋出。

如果你想拋出一個異常,爲每個域類,然後簡單地設置grails.gorm.failOnErrortrue的grails-app/conf目錄/ Config.groovy中

要當心:所有的域屬性都有一個隱含的nullable: false約束。我推薦你閱讀this article

+0

謝謝`grails.gorm.failOnError = true`。恕我直言,它應該是默認的。在任何情況下,它都是我喜歡使用的完美補充:`grails.gorm.default.constraints = {'*'nullable:true}`約束塊應該用於**添加**約束,例如需要一些領域,而不是解除他們。 – Tobia 2015-03-04 18:00:55

2

爲了使您的通話save()RuntimeException,你可以使用item.save(failOnError:true)。但是你也可以檢查save()方法的返回值。如果它是錯誤的,那就意味着發生了錯誤。

if (item.save()) { 
    //succeeded 
} 
else { 
    //not succeeded 
} 
+0

aha,它返回id。我認爲null在這裏沒有任何意義。謝謝! – mkuzmin 2011-01-22 00:41:25

相關問題