我想我知道你的问题在哪里。由于这个问题是谷歌搜索主要结果中弹出的问题,我可以对@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";
}
在这种情况下,在提交带有空姓氏字段的表单后,您将收到一个错误页面,因为您正在应用验证规则,但您并没有对其进行任何处理。
所述错误的示例:
异常页面
场景 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 等...),您仍然需要指定要做什么的策略与所述验证的结果。
希望我能够为可能会遇到这种情况的人清除一些东西。