我想我知道你的问题在哪里。由于这个问题是在 google 的主要搜索结果中弹出的问题,所以我可以对 @Valid 注释的作用给出一个简单的答案。
我将介绍我如何使用@Valid 的 3 个场景
型号:
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";
}
在这种情况下,在提交您的带有空姓氏字段的表单后,您将收到一个错误页面,因为您正在应用验证规则,但您并没有对其进行任何处理。
上述错误示例:
Exception page
场景 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 在处理表单模型时触发的异常.检查this 看看如何处理映射等等。
总结:@Valid 本身不会触发验证 JSR 303 注释字段的验证(@NotNull、@Email、@Size 等... ),您仍然需要指定如何处理上述验证结果的策略。
希望我能够为可能遇到此问题的人澄清一些问题。