【问题标题】: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()
  }
}

看起来很合乎逻辑,但为什么会如此无声地跳过?在这种情况下,我可以配置一些东西来获取异常吗?

谢谢

【问题讨论】:

    标签: hibernate grails


    【解决方案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 字段默认为必填,而所有其他字段为可选。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多