Разница между значениями @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.
что не очень помогает, потому что оно не говорит точно, как оно отличается. Если вообще. Оба, похоже, работают очень хорошо для меня.
Ответы
Ответ 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
в весенних рамках.
Референс