为啥 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 在域对象保存时不通知我错误?的主要内容,如果未能解决你的问题,请参考以下文章

在域类中使用 grails 服务

级联错误将重新保存 grails 删除的对象

为啥用户单击通知时不存在 userInfo?

Grails/GORM 中的错误:已删除的对象将被级联重新保存

为啥 SSMS 在添加列时不智能?

为啥 GORM 不保存我的对象?