2011-01-21 31 views
14

Tôi mới bắt đầu với Grails, và đây là vấn đề đầu tiên.Tại sao Grails không thông báo cho tôi về lỗi khi lưu đối tượng miền?

Tôi đã dành vài giờ để tìm ra rằng đối tượng miền không thể được chèn vào DB, cho đến khi tất cả các thuộc tính của nó được điền.

class Item { 
    String title 
    String link 
} 

class ItemController { 
    def fetch = { 
    def item = new Item() 
    item.title = "blabla" 
    // no value for "link" 
    item.save() 
    } 
} 

Trông hợp lý, nhưng tại sao nó bị bỏ qua âm thầm? Tôi có thể cấu hình một cái gì đó để có được trường hợp ngoại lệ trong các trường hợp như vậy?

Cảm ơn

Trả lời

29

Không có ngoại lệ nào được ném theo mặc định.

Phương pháp save() được tiêm vào Lớp miền trả về false nếu xảy ra lỗi trong giai đoạn xác thực. Một mẫu mã cổ điển để kiểm tra tiết kiệm/cập nhật của một lớp miền là:

if (!myDomainObj.save()) { 
    log.warn myDomainObj.errors.allErrors.join(' \n') //each error is an instance of org.springframework.validation.FieldError  
} 

Nếu bạn cần phải có một ngoại lệ cho một lớp tên miền cụ thể, sử dụng:

myDomainObj.save(failOnError: true) 

và các ngoại lệ cho thất bại xác nhận sẽ bị ném.

Nếu bạn muốn ném một ngoại lệ cho MỌI lớp miền, sau đó chỉ cần đặt grails.gorm.failOnError để true trong grails-app/conf/Config.groovy

Hãy cẩn thận: tất cả các đặc tính miền có một tiềm ẩn nullable: false hạn chế.

Tôi khuyên bạn nên đọc this article.

+0

Cảm ơn bạn vì 'grails.gorm.failOnError = true'. IMHO nó phải là mặc định. Trong mọi trường hợp, nó là một bổ sung hoàn hảo cho cái này mà tôi thích sử dụng: 'grails.gorm.default.constraints = {'*' nullable: true}' Các khối ràng buộc nên được sử dụng để ** thêm ** các ràng buộc, chẳng hạn như một số lĩnh vực được yêu cầu, không phải để nâng chúng. – Tobia

+0

Lý tưởng nhất là IMHO, Grails sẽ tạo các trường 'ownedTo' theo mặc định, và tất cả các trường tùy chọn khác. – Tobia

2

Để thực hiện cuộc gọi save() bạn ném một RuntimeException, bạn có thể sử dụng item.save(failOnError:true). Nhưng bạn cũng có thể kiểm tra giá trị trả về của phương thức save(). Nếu nó sai, điều đó có nghĩa là đã xảy ra sự cố.

if (item.save()) { 
    //succeeded 
} 
else { 
    //not succeeded 
} 
+0

aha, nó trả về id. Tôi nghĩ null có nghĩa là không có gì ở đây. Cảm ơn! – mkuzmin

Các vấn đề liên quan