2009-03-04 22 views
5

Khi lưu trữ các đối tượng miền sử dụng Grails/GORM, tôi thường tự hỏi tại sao lệnh save() bị lỗi.o.errors.allErrors.each {println it} theo mặc định khi không lưu đối tượng miền

này có thể dễ dàng được giải quyết bằng cách thêm logic:

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

Tuy nhiên, thêm này ở khắp mọi nơi tôi làm một lệnh .save() thêm nhiều mã trùng lặp. Theo tinh thần của DRY, tôi muốn cấu hình Grails/GORM để tự động in mọi lỗi lưu vào giao diện điều khiển (stderr). Điều đó có thể không? Nếu không, làm thế nào để mở rộng GORM để làm cho nó có thể?

Trả lời

9

Giải pháp:

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

này thêm một phương pháp gọi là s() sẽ gọi tiết kiệm() và in bất kỳ lỗi nào.

+1

Đó là một sự mở rộng tốt đẹp của câu trả lời tôi đã cung cấp. Vui vì bạn đã giải quyết nó. – codeLes

+3

Điều này sẽ thêm s() cho tất cả các đối tượng, không chỉ đối tượng miền. Để chỉ thêm nó vào các đối tượng miền, tôi nghĩ bạn cần thực hiện lập trình meta trong trình đóng góp doWithDynamicMethods của một plugin –

0

Đây không phải là giao diện đẹp nhất và có thể là tốt hơn, groovier cách để thực hiện việc này. Dựa trên tìm here Tôi đặt cùng mã này có thể có một cái gì đó bạn có thể mở rộng và sử dụng:

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

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

def b = new Book() 

b.customPrintTitle() 
Các vấn đề liên quan