Різниця між @Valid та @Validated навесні


107

Spring підтримує два різні способи перевірки: Весняна перевірка та перевірка бобів JSR-303. Обидва можна використовувати, визначивши валідатор Spring, який делегує іншим делегаторам, включаючи валідатор бобів. Все йде нормально.

Але коли коментувати методи фактично вимагати перевірки, це вже інша історія. Я можу так коментувати

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

або як це

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

Тут @Valid є javax.validation.Valid , а @Validated є org.springframework.validation.annotation.Validated . Документи для останнього кажуть

Варіант дійсного JSR-303, що підтримує специфікацію груп перевірки. Розроблений для зручного використання з підтримкою JSR-303 Spring, але не специфічним для JSR-303.

що не дуже допомагає, оскільки не вказує, як саме відрізняється. Якщо взагалі. Обидва, здається, працюють досить добре для мене.


2
Може бути цікаво: stackoverflow.com/questions/18911154 / ...
Wim Deblauwe

4
"підтримка специфікації груп перевірки" - це дуже чітке твердження.
кращий олівер

Я повинен подумати, що Дійсний тісно поєднаний з валідаціями JSR 303 (NotNull тощо). В той час як ви можете створити інші групи перевірки / перевірити їх у "Валідизовані".
Атул

@zeroflagL, правда, але оскільки я ніколи цього не використовував, я пропустив пункт і замість цього закріпився на частині "не JSR-303". Тепер зрозуміло.
Сергій Таченов

Відповіді:


83

Як ви цитували з документації, @Validatedдодано до підтримки "груп перевірки", тобто групи полів у валідованому бобі. Це можна використовувати у формах із декількома кроками, де ви можете перевірити ім'я, електронну пошту тощо тощо на першому кроці, а потім у інших полях у наступних кроках.

Причина, чому це не було додано до @Validанотації, полягає в тому, що він стандартизований за допомогою процесу спільноти Java (JSR-303), який потребує часу, і розробники Spring хочуть дозволити людям скоріше використовувати цю функціональність.

Перейдіть до цього квитка, щоб побачити, як з'явилася анотація.


114

Більш пряма відповідь вперед. Для тих, хто досі не знає, що таке "валідаційна група" .

Використання для @Validперевірки

Контролер:

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

Об'єкт форми:

public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}

Використання для @Validatedгрупи перевірки
Джерело: http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html

Контролер:

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

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

Об'єкт форми:

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;

}

дякую @ Zhuhang.jasper за детальне пояснення з великою простотою.
Гаутам Тяги

Це саме те, що я шукав останні 2 години, дякую @ Zhuhang.jasper
Shady Hussein

дякую @zhuhang шукали цього.
Вішну Дахатонде

4

В даному прикладі фрагменти коду питання, @Validі @Validatedне мають ніякого значення. Але якщо @RequestBodyанотація Listоб'єкта або це рядкове значення, зазначається @RequestParam, перевірка не набере чинності.

Ми можемо використовувати @Validatedможливості перевірки рівня методу, щоб змусити його працювати. Для досягнення цього ключовим моментом є розміщення @Validatedна уроці. Це може бути ще однією важливою відмінністю між @Validта @Validatedвесною.

Рефренс


Чи можете ви пояснити, чому анотація не впливає на Listоб’єкти? Я припускаю, що це також не спрацює для інших колекцій, як Map? Може бути , ви могли б дати мені більше докладне пояснення в моєму питанні: stackoverflow.com/questions/60167961 / ...
Theiaz

1
@Theiaz Як хочеш
Лебекка

1

крім вище, ви можете подати заявку @Validна домен / поле лише для вкладеної перевірки, а не з а @validated.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.