2009-12-09 47 views
9

Trong ứng dụng Grails của tôi, tôi có một đối tượng lệnh bên ngoài có chứa một danh sách các đối tượng lệnh khác:Grails: lồng nhau đối tượng lệnh

public class OuterCommand { 

    List<InnerCommand> innerCommands = ListUtils.lazyList([], FactoryUtils.instantiateFactory(InnerCommand)) 
} 

class InnerCommand { 
    String code 
    Long id 
    String value 

    static constraints = { 
     code(nullable: false, blank: false) 
     value(nullable: false, blank: false) 
    } 
} 

Các instantiation khá bất thường của innerCommands được dựa trên this advice. Tuy nhiên, tôi thấy rằng nếu tôi gọi validate() trên một phiên bản của OuterCommand, xác thực dường như không xác thực các phiên bản có chứa của InnerCommand.

Có thể lồng các đối tượng lệnh và có toàn bộ đồ thị của các đối tượng lệnh được xác thực khi validate() được gọi trên đối tượng ngoài cùng không?

Cảm ơn, Don

Trả lời

0

Tôi không nghĩ rằng miền Objects trong một Command hay lồng nhau Các lệnh được xác nhận theo mặc định, bạn sẽ phải viết a validator mà vòng qua innerCommands và xác nhận tất cả.

static constraints = { 
    innerCommands(validator:{val,obj -> 
     //validate and merge errors from each innerCommand 
    }) 
} 

Có thể bạn sẽ phải xử lý đối tượng Lỗi và hợp nhất tất cả kết quả với nhau nhưng không quá khó.

+0

là này vẫn là trường hợp? – dbrin

8

Tôi đã làm việc này bằng cách làm theo các bước sau:

Làm cho đối tượng lệnh bên trong hợp lệ vì nó không được khởi tạo như đối tượng lệnh bình thường. Có hai cách để làm điều này, với @org.codehaus.groovy.grails.validation.Validateable chú thích, hoặc qua các nhân grails tham số cấu hình grails.validateable.classes

Thêm một validator tùy chỉnh cho innerCommands để OuterCommand

static constraints = { 
    innerCommands(validator: {val, obj -> 
     // 'attributes.validation.failed' is the key for the message that will 
     // be shown if validation of innerCommands fails 
     return val.every { it.validate() } ?: ['attributes.validation.failed'] 
    }) 
} 
+0

Xem http://old.nabble.com/validating-nested-command-objects-td26714921.html#a26715507 để thảo luận. –

+0

là trường hợp này vẫn còn? – dbrin

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