2009-03-04 15 views
5

Grails/GORM kullanarak etki alanı nesnelerini sürdürürken, genellikle bir save() çağrısının neden başarısız olduğunu merak ediyorum. o.errors.allErrors.each {println it}

Bu

kolayca mantığı eklenerek çözülebilir:

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

Ancak yinelenen bir sürü kod ekler) bu her yerde ben bir .Save (do ekledi. DRY'nin ruhuyla Grails/GORM'i herhangi bir kayıt hatası (otomatik olarak) (stderr) otomatik olarak yazdırmak için yapılandırmak isterim. Mümkün mü? Değilse, mümkün kılmak için GORM'u nasıl uzatabilirim?

cevap

9

Çözüm: Bu yöntem denilen s() (tasarruf arayacak) ekler

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

ve here seyir dayanarak ben birlikte genişletip bir şey ve kullanım olabilir bu kodu koymak herhangi bir hatayı yazdır.

+1

Sağladığım yanıtın güzel bir uzantısı. Çözdüğüne sevindim. – codeLes

+3

Bu, s() öğesini yalnızca nesne nesnelerine değil, tüm nesnelere ekler. Sadece etki alanı nesnelerine eklemek için, bir eklentinin doWithDynamicMethods kapağında meta programlamayı yapmanız gerektiğini düşünüyorum –

0

Bu görünümlü temiz değildir ve bunu yapmak için iyi, groovier yolu muhtemelen vardır.

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

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

def b = new Book() 

b.customPrintTitle()