我刚开始使用Grails,这是第一个问题。
我花了几个小时才发现域对象无法插入到DB中,直到填充了所有属性。
class Item {
String title
String link
}
class ItemController {
def fetch = {
def item = new Item()
item.title = "blabla"
// no value for "link"
item.save()
}
}
看起来合乎逻辑,但为什么它会如此默默地跳过?在这种情况下,我可以配置一些东西来获得异常吗?
由于
答案 0 :(得分:30)
默认情况下不会抛出任何异常。
如果在验证阶段发生错误,则注入Domain类的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-app / conf / Config.groovy 中将grails.gorm.failOnError
设置为true
注意:所有域属性都有一个隐式nullable: false
约束。
我建议你阅读this article。
答案 1 :(得分:4)
要使save()
来电RuntimeException
,您可以使用item.save(failOnError:true)
。但您也可以检查save()方法的返回值。如果它是假的,那就意味着发生了错误。
if (item.save()) {
//succeeded
}
else {
//not succeeded
}