我想我知道你要问什么。既然这个问题是谷歌搜索主结果中出现的,我可以简单地解释一下@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字段为空,则会因为应用了验证规则但未进行处理而得到错误页面。
所示错误的示例:
异常页面
第二个方案的控制器:
@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等),你仍然需要指定处理验证结果的策略。
希望我能够对可能遇到此问题的人们解释清楚一些内容。
ScriptFile
类对类数据成员(如@NotNull
、@NotEmpty
等)进行了约束,而@Valid
指示框架(在我们这里是 Spring)检查当某人调用您的方法时提供的参数是否符合这些约束。在这种情况下,如果验证失败,服务器将响应带有HTTP 400 Bad Request
状态码的请求。 - Emre Tapcı