为啥 Grails 在域对象保存时不通知我错误?
Posted
技术标签:
【中文标题】为啥 Grails 在域对象保存时不通知我错误?【英文标题】:Why doesn't Grails notify me of error at domain object saving?为什么 Grails 在域对象保存时不通知我错误? 【发布时间】:2011-06-13 11:54:57 【问题描述】:我刚从 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()
看起来很合乎逻辑,但为什么会如此无声地跳过?在这种情况下,我可以配置一些东西来获取异常吗?
谢谢
【问题讨论】:
【参考方案1】:要让您的save()
调用抛出RuntimeException
,您可以使用item.save(failOnError:true)
。但是您也可以检查 save() 方法的返回值。如果它是假的,那就意味着发生了错误。
if (item.save())
//succeeded
else
//not succeeded
【讨论】:
啊哈,它返回 id。我认为 null 在这里没有任何意义。谢谢!【参考方案2】:默认不抛出异常。
如果在验证阶段发生错误,注入到域类的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。
【讨论】:
感谢grails.gorm.failOnError = true
。恕我直言,它应该是默认值。无论如何,它是对我喜欢使用的这个的完美补充:grails.gorm.default.constraints = '*' nullable: true
约束块应该用于添加约束,例如需要某些字段,而不是解除它们。跨度>
理想情况下,恕我直言,Grails 应该使 belongsTo
字段默认为必填,而所有其他字段为可选。以上是关于为啥 Grails 在域对象保存时不通知我错误?的主要内容,如果未能解决你的问题,请参考以下文章