Думаю, я знаю, к чему ведет ваш вопрос. И поскольку именно этот вопрос появляется в основных результатах поиска 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 и т. д. strong >), вам все равно нужно указать стратегию того, что делать с результатами указанной проверки.
Надеюсь, я смог кое-что прояснить для людей, которые могут с этим споткнуться.
person
Alan Balderas Sánchez
schedule
20.10.2020