o.errors.allErrors.each {println it}默认情况下无法保存域对象

时间:2009-03-04 16:14:26

标签: grails groovy metaprogramming gorm

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

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

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

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

2 个答案:

答案 0 :(得分:9)

解决方案:

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

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

答案 1 :(得分:0)

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

class Book {
   void printTitle(){ println "The Title" }
}

Book.metaClass.customPrintTitle << {-> 
    println "changin ur class"
    printTitle()
}

def b = new Book()

b.customPrintTitle()