【问题标题】:o.errors.allErrors.each { println it } by default when failing to save a domain objecto.errors.allErrors.each { println it } 保存域对象失败时默认
【发布时间】:2010-10-11 07:25:46
【问题描述】:

在使用 Grails/GORM 持久化域对象时,我经常发现自己想知道为什么 save() 调用会失败。

这可以通过添加逻辑轻松解决:

if (!o.save()) {
    o.errors.allErrors.each { println it }
}

但是,在我执行 .save() 的任何地方添加它都会增加很多重复的代码。本着 DRY 的精神,我想配置 Grails/GORM 以自动将任何保存错误打印到控制台 (stderr)。那可能吗?如果没有,我如何扩展 GORM 以使其成为可能?

【问题讨论】:

    标签: grails groovy metaprogramming grails-orm


    【解决方案1】:

    解决方案:

    Object.metaClass.s = {
        def o = delegate.save()
        if (!o) {
            delegate.errors.allErrors.each {
                println it
            }
        }
        o
    }
    

    这会添加一个名为 s() 的方法,该方法将调用 save() 并打印任何错误。

    【讨论】:

    • 这是我提供的答案的一个很好的扩展。很高兴你解决了。
    • 这会将 s() 添加到所有对象,而不仅仅是域对象。要将其仅添加到域对象中,我认为您需要在插件的 doWithDynamicMethods 闭包中进行元编程
    【解决方案2】:

    这不是最干净的外观,并且可能有一个更好groovier的方法来做到这一点。基于查看here,我将这段代码放在一起,您可能可以扩展和使用:

    class Book {
       void printTitle(){ println "The Title" }
    }
    
    Book.metaClass.customPrintTitle << {-> 
        println "changin ur class"
        printTitle()
    }
    
    def b = new Book()
    
    b.customPrintTitle()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2015-11-22
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多