2009-03-04 2 views
5

Lorsque persister des objets de domaine en utilisant Grails/GORM, je me demande souvent pourquoi un appel save() échoue.o.errors.allErrors.each {println it} par défaut lors de l'enregistrement d'un objet domaine

Cela peut être facilement résolu en ajoutant la logique:

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

Cependant, l'ajout de ce partout je fais un .save() ajoute beaucoup de code en double. Dans l'esprit de DRY, j'aimerais configurer Grails/GORM pour imprimer automatiquement les erreurs de sauvegarde sur la console (stderr). Est-ce possible? Si non, comment puis-je étendre GORM pour le rendre possible?

Répondre

9

Solution:

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

Cela ajoute une méthode appelée s() qui appellera save() et imprime toutes les erreurs.

+1

C'est une belle expansion de la réponse que j'ai fournie. Content que tu l'aies résolu. – codeLes

+3

Ceci ajoutera s() à tous les objets, pas seulement aux objets de domaine. Pour l'ajouter seulement aux objets de domaine, je pense que vous devez faire la métaprogrammation dans la fermeture de doWithDynamicMethods d'un plugin –

0

Ce n'est pas la plus propre à la recherche, et il y a probablement une façon mieux, groovy pour ce faire. Sur la base de la recherche here je mets ensemble ce code qui pourrait être quelque chose que vous pourriez développer et à utiliser:

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

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

def b = new Book() 

b.customPrintTitle() 
Questions connexes