Что означает аннотация @Valid в Spring?
В следующем примере параметр ScriptFile
помечен аннотацией @Valid
.
Что делает аннотация @Valid
?
@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();
}
Ответы
Ответ 1
Это для целей проверки.
Валидация Обычно для проверки после привязки к нему пользователя. Spring 3 обеспечивает поддержку декларативная проверка с помощью JSR-303. Эта поддержка включена автоматически если поставщик JSR-303, такой как Hibernate Validator, присутствует на ваш путь к классу. Когда включено, вы можете триггер проверки аннотирование метода контроллера с аннотацией @Valid: После привязки входящего POST параметров, программа AppointmentForm быть утвержденным; в этом случае, чтобы проверить значение поля даты не равно null и происходит в будущем.
Дополнительную информацию смотрите здесь:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/
Ответ 2
Добавляя к приведенным выше ответам, взгляните на следующее. Столбец dateointForm аннотируется с помощью нескольких аннотаций. Имея @Valid аннотацию, которая запускает проверки в AppointmentForm (в данном случае @NotNull и @Future). Эти аннотации могут поступать от разных поставщиков JSR-303 (например, Hibernate, Spring и т.д.).
@RequestMapping(value = "/appointments", method = RequestMethod.POST)
public String add(@Valid AppointmentForm form, BindingResult result) {
....
}
static class AppointmentForm {
@NotNull @Future
private Date date;
}
Ответ 3
IIRC @Valid не является аннотацией Spring, а аннотацией JSR-303 (которая является стандартом валидации Bean). Что он делает, это в основном проверяет, действительно ли данные, которые вы отправляете методу, или нет (он будет проверять для вас файл scriptFile).
Ответ 4
@Valid
сам по себе не имеет ничего общего с Spring. Это часть спецификации Bean Validation (их несколько, последняя из которых - JSR 380 на второе полугодие 2017 года), но @Valid
очень старая и полностью основана на JSR 303.
Как мы все знаем, Spring очень хорош в обеспечении интеграции со всеми различными JSR и библиотеками Java в целом (например, JPA, JTA, Caching и т.д.), И, конечно, эти ребята также позаботились о проверке. Одним из ключевых компонентов, который облегчает это, является MethodValidationPostProcessor.
Попытка ответить на ваш вопрос - @Valid
очень удобен для так называемого каскадного валидации, когда вы хотите проверить сложный граф, а не только элементы верхнего уровня объекта. Каждый раз, когда вы хотите пойти глубже, вы должны использовать @Valid
. Это то, что диктует JSR. Spring выполнит это с некоторыми небольшими отклонениями (например, я попытался поместить @Validated
вместо @Valid
в метод RestController, и валидация работает, но то же самое не будет применяться к обычным bean-компонентам "service").
Ответ 5
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {
if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");
Я предполагаю, что эта аннотация @NotNull
действительна, поэтому если условие не требуется.
Ответ 6
Просто добавив к вышеуказанному ответу, В веб-приложении
@valid
используется, где bean, подлежащий проверке, также аннотируется аннотациями проверки, например. @NotNull
, @Email
(аннотация спящего режима), поэтому при получении ввода от пользователя значения могут быть проверены, а результат привязки будет иметь результаты проверки.
bindingResult.hasErrors()
сообщит, не прошла ли какая-либо проверка.
Ответ 7
Еще один полезный аспект @Valid, не упомянутый выше, заключается в том, что (то есть: использование Postman для проверки конечной точки) @Valid будет форматировать вывод неправильного вызова REST в форматированный JSON вместо двоичного объекта с едва читаемым текстом. Это очень полезно, если вы создаете коммерчески доступный API для своих пользователей.