2010-08-29 39 views
36

Trong ví dụ sau, thông số ScriptFile được đánh dấu bằng chú thích @Valid.Chú thích @Valid chỉ ra trong Mùa xuân là gì?

Chú thích @Valid là gì?

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)  
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {  
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");   
    if (result.hasErrors()) {   
     modelMap.addAttribute("scriptFile", scriptFile);    
     modelMap.addAttribute("showcases", ShowCase.findAllShowCases());    
     return "scriptfile/create";    
    }   
    scriptFile.persist();   
    return "redirect:/scriptfile/" + scriptFile.getId();   
}  

Trả lời

26

Đó là mục đích xác thực.

Xác thực Việc xác thực mô hình sau khi ràng buộc người dùng nhập vào nó là điều bình thường. Mùa xuân 3 cung cấp hỗ trợ cho xác thực khai báo với JSR-303. Hỗ trợ này được bật tự động nếu nhà cung cấp JSR-303, chẳng hạn như Trình xác thực Hibernate, hiện có trên đường dẫn lớp của bạn. Khi được bật, bạn có thể xác thực kích hoạt chỉ bằng cách chú thích một phương thức Bộ điều khiển tham số với chú thích @Valid: Sau khi ràng buộc các tham số POST gửi đến, xác nhận cuộc hẹn sẽ được xác thực; trong trường hợp này, để xác minh giá trị trường ngày không phải là rỗng và xảy ra trong tương lai.


Nhìn vào đây để biết thêm:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

8

IIRC @Valid không phải là một chú thích mùa xuân nhưng một JSR-303 chú thích (đó là tiêu chuẩn Bean Validation). Những gì nó làm là nó về cơ bản kiểm tra nếu dữ liệu mà bạn gửi đến phương pháp là hợp lệ hay không (nó sẽ xác nhận scriptFile cho bạn).

1

Chỉ cần thêm vào câu trả lời ở trên, Trong ứng dụng web @valid được sử dụng trong đó bean được xác thực cũng được chú thích bằng chú thích xác thực, ví dụ: @NotNull, @Email (chú thích ngủ đông) vì vậy khi nhận được đầu vào từ người dùng, các giá trị có thể được xác thực và kết quả ràng buộc sẽ có kết quả xác thực. bindingResult.hasErrors() sẽ cho biết nếu bất kỳ xác thực nào không thành công.

5

Thêm vào câu trả lời ở trên, hãy xem phần sau. Cột ngày tháng của cuộc hẹn được chú thích bằng một vài chú thích. Bằng cách có chú thích @Valid kích hoạt xác thực trên AppointmentForm (trong trường hợp này là @NotNull và @Future). Các chú thích này có thể đến từ các nhà cung cấp JSR-303 khác nhau (ví dụ: Hibernate, Spring..etc).

@RequestMapping(value = "/appointments", method = RequestMethod.POST) 
    public String add(@Valid AppointmentForm form, BindingResult result) { 
     .... 
    } 

    static class AppointmentForm { 

     @NotNull @Future 
     private Date date; 
    } 
1
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {  
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");   

Tôi đoán @NotNull chú thích này là hợp lệ do đó nếu điều kiện là không cần thiết.

3

@Valid bản thân nó không liên quan gì đến Spring. Đó là một phần của đặc tả Bean Validation (có một số trong số đó, phiên bản mới nhất là JSR 380 vào nửa cuối năm 2017), nhưng @Valid là rất cũ và có nguồn gốc từ JSR 303.

Như chúng ta đã biết, Spring rất giỏi trong việc cung cấp sự tích hợp với tất cả các thư viện JSR và java khác nhau nói chung (nghĩ về JPA, JTA, Caching, vv) và tất nhiên những kẻ đó cũng quan tâm đến việc xác thực. Một trong những thành phần chính tạo điều kiện thuận lợi cho việc này là MethodValidationPostProcessor.

Cố gắng trả lời câu hỏi của bạn - @Valid rất tiện dụng cho việc gọi xác thực tầng khi bạn muốn xác thực biểu đồ phức tạp chứ không chỉ là yếu tố cấp cao nhất của đối tượng. Mỗi khi bạn muốn đi sâu hơn, bạn phải sử dụng @Valid. Đó là những gì JSR ra lệnh. Mùa xuân sẽ tuân thủ điều đó với một số sai lệch nhỏ (ví dụ: tôi đã thử đặt @Validated thay vì @Valid trên phương thức RestController và xác thực hoạt động, nhưng điều tương tự sẽ không áp dụng cho hạt "dịch vụ" thông thường).

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