Sự khác biệt giữa @Valid và @Validated trong mùa xuân


106

Spring hỗ trợ hai phương thức xác thực khác nhau: Xác thực mùa xuân và xác thực bean JSR-303. Cả hai đều có thể được sử dụng bằng cách xác định một trình xác thực Spring ủy quyền cho những người ủy quyền khác bao gồm cả trình xác nhận bean. Càng xa càng tốt.

Nhưng khi chú thích các phương thức để thực sự yêu cầu xác thực, đó là một câu chuyện khác. Tôi có thể chú thích như thế này

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {

hoặc như thế này

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {

Ở đây, @Valid là javax.validation.Valid và @Validated là org.springframework.validation.annotation.Validated . Các tài liệu cho sau này nói

Biến thể của JSR-303's Valid, hỗ trợ đặc điểm kỹ thuật của các nhóm xác thực. Được thiết kế để sử dụng thuận tiện với hỗ trợ JSR-303 của Spring nhưng không phải JSR-303 cụ thể.

điều này không giúp ích nhiều vì nó không cho biết chính xác nó khác nhau như thế nào. Nếu ở tất cả. Cả hai dường như đang hoạt động khá tốt đối với tôi.



4
"hỗ trợ đặc tả của các nhóm xác nhận" là một tuyên bố rất rõ ràng.
một oliver tốt hơn.

Tôi nên nghĩ rằng Hợp lệ được kết hợp chặt chẽ với xác thực JSR 303 (NotNull, v.v.). Trong khi đó, bạn có thể tạo các nhóm / xác thực khác và yêu cầu chúng kiểm tra trong Đã xác thực.
Atul

@zeroflagL, true, nhưng vì tôi chưa bao giờ sử dụng nó, nên tôi đã bỏ sót điểm và thay vào đó sửa lại phần “không phải JSR-303 cụ thể”. Bây giờ thì rõ ràng.
Sergei Tachenov

Câu trả lời:


83

Như bạn đã trích dẫn từ tài liệu, @Validatedđã được thêm vào để hỗ trợ "các nhóm xác thực", tức là nhóm các trường trong bean đã được xác thực. Điều này có thể được sử dụng trong các biểu mẫu nhiều bước, nơi bạn có thể xác thực tên, email, v.v. trong bước đầu tiên và sau đó là các trường khác trong (các) bước sau.

Lý do tại sao điều này không được thêm vào @Valid chú thích là vì nó được chuẩn hóa bằng cách sử dụng quy trình cộng đồng java (JSR-303), điều này cần thời gian và các nhà phát triển Spring muốn cho phép mọi người sử dụng chức năng này sớm hơn.

Tới vé jira này để xem cách chú thích ra đời.


112

Một câu trả lời thẳng thắn hơn. Đối với những người vẫn không biết những gì trên trái đất là "nhóm xác nhận" .

Sử dụng để @Validxác thực

Bộ điều khiển:

@RequestMapping(value = "createAccount")
public String stepOne(@Valid Account account) {...}

Đối tượng biểu mẫu:

public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}

Sử dụng cho @ValidatedNhóm xác thực
Nguồn: http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html

Bộ điều khiển:

@RequestMapping(value = "stepOne")
public String stepOne(@Validated(Account.ValidationStepOne.class) Account account) {...}

@RequestMapping(value = "stepTwo")
public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account) {...}

Đối tượng biểu mẫu:

public class Account {

    @NotBlank(groups = {ValidationStepOne.class})
    private String username;

    @Email(groups = {ValidationStepOne.class})
    @NotBlank(groups = {ValidationStepOne.class})
    private String email;

    @NotBlank(groups = {ValidationStepTwo.class})
    @StrongPassword(groups = {ValidationStepTwo.class})
    private String password;

    @NotBlank(groups = {ValidationStepTwo.class})
    private String confirmedPassword;

}

cảm ơn @ Zhuhang.jasper vì đã giải thích chi tiết và hết sức đơn giản.
Gautam Tyagi

Đây chính xác là những gì tôi đã tìm kiếm trong 2 giờ qua, cảm ơn @ Zhuhang.jasper
Shady Hussein

cảm ơn @zhuhang. đã được tìm kiếm điều này.
Vishnu Dahatonde

4

Trong đoạn mã ví dụ của câu hỏi, @Valid@Validatedkhông có gì khác biệt. Nhưng nếu @RequestBodyđược chú thích bằng một Listđối tượng hoặc là một giá trị chuỗi được chú thích bởi@RequestParam , xác thực sẽ không có hiệu lực.

Chúng ta có thể sử dụng @Validatedkhả năng xác thực cấp phương pháp của để làm cho nó hoạt động. Để đạt được điều này, điểm mấu chốt là đặt @Validatedtrên lớp. Đây có thể là một sự khác biệt quan trọng khác giữa @Valid@Validatedtrong khuôn khổ mùa xuân.

Sự suy tôn


Bạn có thể giải thích tại sao chú thích không có tác dụng đối với Listcác đối tượng? Tôi giả định rằng điều này cũng sẽ không hoạt động cho các bộ sưu tập khác như thế Mapnào? Có lẽ bạn có thể cho tôi lời giải thích chi tiết hơn về câu hỏi của tôi: stackoverflow.com/questions/60167961/…
Theiaz

1
@Theiaz Như bạn muốn
Lebecca

1

ngoài ra ở trên, bạn chỉ có thể áp dụng @Validtrên một miền / trường để xác thực lồng nhau, không phải với a @validated.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.