В следующем примере 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();
}
источник
@Valid
отApplicationForm
параметра , но, по- прежнему валидации были выпущены наdate
(набор вnull
) поле. Пожалуйста, объясни.IIRC @Valid - это не аннотация Spring, а аннотация JSR-303 (которая является стандартом проверки компонентов). Что он делает, так это в основном проверяет, действительны ли данные, которые вы отправляете методу (он проверит за вас scriptFile).
источник
@Valid
сам по себе не имеет ничего общего с Spring. Это часть спецификации Bean Validation (их несколько, последняя из которых - JSR 380 на вторую половину 2017 года), но@Valid
она очень старая и полностью унаследована от JSR 303.Как мы все знаем, Spring очень хорош в обеспечении интеграции со всеми различными JSR и Java-библиотеками в целом (подумайте о JPA, JTA, кешировании и т. Д.), И, конечно, эти ребята позаботились и о проверке. Одним из ключевых компонентов, способствующих этому, является MethodValidationPostProcessor .
Попытка ответить на ваш вопрос -
@Valid
очень удобна для так называемого каскадирования валидации, когда вы хотите проверить сложный граф, а не только элементы верхнего уровня объекта. Каждый раз, когда вы хотите пойти глубже, вы должны использовать@Valid
. Это то, что диктует JSR. Spring будет соответствовать этому с некоторыми незначительными отклонениями (например, я попытался поставить@Validated
вместо@Valid
метода RestController, и проверка работает, но то же самое не применимо к обычным "служебным" компонентам).источник
ScriptFile scriptFile
.public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) { if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");
Я предполагаю, что эта
@NotNull
аннотация действительна, поэтому, если условие не требуется.источник
Просто добавить в ответе выше, в веб - приложении
@valid
используется там , где боб быть подтверждено также аннотацию проверки аннотаций , например@NotNull
,@Email
(спящий режим аннотаций) , поэтому , когда при получении ввода от пользователя значения могут быть проверены и связывания результат будет иметь подтверждение полученные результаты.bindingResult.hasErrors()
сообщит, если какая-либо проверка не удалась.источник
Другой удобный аспект @Valid, не упомянутый выше, заключается в том, что (например, использование Postman для тестирования конечной точки) @Valid форматирует вывод неправильного вызова REST в форматированный JSON вместо капли с труднодоступным текстом. Это очень полезно, если вы создаете коммерчески доступный API для своих пользователей.
источник
Думаю, я знаю, к чему ведет ваш вопрос. И поскольку именно этот вопрос появляется в основных результатах поиска Google, я могу дать простой ответ о том, что делает аннотация @Valid.
Я представлю 3 сценария того, как я использовал @Valid
Модель:
public class Employee{ private String name; @NotNull(message="cannot be null") @Size(min=1, message="cannot be blank") private String lastName; //Getters and Setters for both fields. //... }
JSP:
... <form:form action="processForm" modelAttribute="employee"> <form:input type="text" path="name"/> <br> <form:input type="text" path="lastName"/> <form:errors path="lastName"/> <input type="submit" value="Submit"/> </form:form> ...
Контроллер для сценария 1:
@RequestMapping("processForm") public String processFormData(@Valid @ModelAttribute("employee") Employee employee){ return "employee-confirmation-page"; }
В этом сценарии после отправки формы с пустым полем lastName вы получите страницу с ошибкой, так как вы применяете правила проверки, но не обрабатываете ее вообще.
Пример указанной ошибки: страница исключения
Контроллер для сценария 2:
@RequestMapping("processForm") public String processFormData(@Valid @ModelAttribute("employee") Employee employee, BindingResult bindingResult){ return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page"; }
В этом сценарии вы передаете все результаты этой проверки в bindingResult, поэтому вам решать, что делать с результатами проверки этой формы.
Контроллер для сценария 3:
@RequestMapping("processForm") public String processFormData(@Valid @ModelAttribute("employee") Employee employee){ return "employee-confirmation-page"; } @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public Map<String, String> invalidFormProcessor(MethodArgumentNotValidException ex){ //Your mapping of the errors...etc }
В этом сценарии вы по-прежнему не обрабатываете ошибки, как в первом сценарии, но вы передаете это другому методу, который позаботится об исключении, которое запускает @Valid при обработке модели формы. Проверьте это, посмотрите, что делать с отображением и всем остальным.
Подводя итог : @Valid сам по себе, не делая ничего, что запускает проверку аннотированных полей JSR 303 ( @NotNull, @Email, @Size и т. Д. ), Вам все равно нужно указать стратегию того, что делать с результатами указанной проверки.
Надеюсь, я смог кое-что прояснить для людей, которые могут с этим споткнуться.
источник