我想我知道你的问题要去哪里。而且由于这个问题是在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;
}
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
)字段上进行了验证。请解释。