Думаю, я знаю, к чему ведет ваш вопрос. И поскольку именно этот вопрос появляется в основных результатах поиска 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;
}
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){
}
В этом сценарии вы по-прежнему не обрабатываете ошибки, как в первом сценарии, но вы передаете это другому методу, который позаботится об исключении, которое запускает @Valid при обработке модели формы. Проверьте это, посмотрите, что делать с отображением и всем остальным.
Подводя итог : @Valid сам по себе, не делая ничего, что запускает проверку аннотированных полей JSR 303 ( @NotNull, @Email, @Size и т. Д. ), Вам все равно нужно указать стратегию того, что делать с результатами указанной проверки.
Надеюсь, я смог кое-что прояснить для людей, которые могут с этим споткнуться.
@Valid
отApplicationForm
параметра , но, по- прежнему валидации были выпущены наdate
(набор вnull
) поле. Пожалуйста, объясни.