Подтвердить что ты не робот

Разница между значениями @Valid и @Validated в Spring

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

Но когда аннотирующие методы действительно запрашивают проверку, это еще одна история. Я могу так аннотировать

@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. Утвержденные. Документы для последнего говорят

Вариант JSR-303 Действителен, поддерживая спецификацию валидации групп. Предназначен для удобного использования с поддержкой Spring JSR-303, но а не JSR-303.

что не очень помогает, потому что оно не говорит точно, как оно отличается. Если вообще. Оба, похоже, работают очень хорошо для меня.

4b9b3361

Ответ 1

Как вы указали в документации, @Validated был добавлен для поддержки "групп проверки", т.е. группы полей в проверке bean. Это можно использовать в многоэтапных формах, где вы можете проверить имя, адрес электронной почты и т.д. На первом шаге, а затем на других шагах (шагах).

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

Перейдите в этот jira ticket, чтобы узнать, как появилась аннотация.

Ответ 2

Более прямой ответ. Для тех, кто до сих пор не знает, что такое "группа проверки".

Использование для проверки @Valid

контроллер:

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

Форма объекта:

public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}

Использование для @Validated Validation Group
Источник: 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;

}

Ответ 3

кроме того, вы можете применять @Valid только для домена/поля для вложенной проверки, а не для @validated.

Ответ 4

В примерах кода примера, @Valid и @Validated не имеют значения. Но если @RequestBody аннотирован объектом List или является строковым значением, аннотированным @RequestParam, проверка не вступит в силу.

Мы можем использовать возможность проверки на уровне метода @Validated, чтобы она работала. Чтобы достичь этого, ключевым моментом является поместить @Validated в класс. Это может быть еще одним важным отличием между @Valid и @Validated в весенних рамках.

Референс