2009-03-04 20 views
5

Podczas utrzymywania obiektów domeny za pomocą Grails/GORM często zastanawiam się, dlaczego wywołanie save() nie działa.o.errors.allErrors.each domyślnie {println it}, gdy nie zapisuje obiektu domeny

ten można łatwo rozwiązać dodając logikę:

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

Jednak dodanie tego wszędzie robię .save() dodaje wiele zduplikowanych kodu. W duchu DRY chciałbym skonfigurować Grails/GORM, aby automatycznie drukować błędy zapisu na konsoli (stderr). Czy to jest możliwe? Jeśli nie, w jaki sposób mogę rozszerzyć GORM, aby było to możliwe?

Odpowiedz

9

Rozwiązanie:

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

Dodaje to metoda zwana A S(), która wywoła save() i wydrukuj wszelkie błędy.

+1

To miłe rozwinięcie odpowiedzi, którą podałem. Cieszę się, że to rozwiązałeś. – codeLes

+3

Spowoduje to dodanie s() do wszystkich obiektów, a nie tylko obiektów domeny. Aby dodać go tylko do obiektów domeny, myślę, że musisz zrobić metaprogramowanie w doveithynormalets zamknięcie wtyczki –

0

To nie jest najczystszym szuka, a nie ma chyba lepiej, groovier sposób to zrobić. Na podstawie patrząc here Stworzyłam ten kod, który może być coś można poszerzyć i zastosowanie:

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

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

def b = new Book() 

b.customPrintTitle()