2009-03-04 16 views
5

Cuando persisten objetos de dominio utilizando Grails/GORM, frecuentemente me pregunto por qué una llamada a save() falla.o.errors.allErrors.each {println it} de forma predeterminada al no guardar un objeto de dominio

Esto puede ser fácilmente resuelto mediante la adición de la lógica:

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

Sin embargo, la adición de este en todas partes que hacen un .save() añade una gran cantidad de código duplicado. En el espíritu de DRY, me gustaría configurar Grails/GORM para imprimir automáticamente cualquier error de guardado en la consola (stderr). ¿Es eso posible? Si no, ¿cómo extiendo GORM para que sea posible?

Respuesta

9

Solución:

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

Esto añade un método llamado s() que va a llamar a save() y imprimir cualquier error

+1

Esa es una buena expansión de la respuesta que proporcioné. Me alegra que lo hayas resuelto. – codeLes

+3

Esto agregará s() a todos los objetos, no solo a los objetos de dominio. Para agregarlo solo a los objetos de dominio, creo que debe hacer la metaprogramación en el cierre doWithDynamicMethods de un complemento –

0

Este no es el más limpio buscando, y es probable que haya una mejor , groovy manera de hacer esto. Basado en busca here que arme el código que podría ser algo que se podría ampliar y uso:

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

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

def b = new Book() 

b.customPrintTitle() 
Cuestiones relacionadas