2.3.2 在表单绑定时执行验证
既然已经声明了应该如何验证 Taco 和 TacoOrder,那么我们需要重新访问每个控制器,并指定应该在将表单提交到各自的处理程序方法时执行验证。
要验证提交的 Taco,需要将 Java Bean Validation API 的 @Valid
注解添加到 DesignTacoController 的 processDesign()
方法的 Taco 参数中。
程序清单 2.13 验证 POST 来的 Taco
import javax.validation.Valid;
import org.springframework.validation.Errors;
...
@PostMapping
public String processTaco(@Valid @ModelAttribute("taco") Taco taco, Errors errors) {
if (errors.hasErrors()) {
return "design";
}
// Save the taco...
// We'll do this in chapter 3
log.info("Processing taco: " + taco);
return "redirect:/orders/current";
}
@Valid
注解告诉 Spring MVC 在提交的 Taco 对象绑定到提交的表单数据之后,以及调用 processDesign()
方法之前,对提交的 Taco 对象执行验证。如果存在任何验证错误,这些错误的详细信息将在传递到 processDesign()
的错误对象中捕获。processDesign()
的前几行查询 Errors 对象,询问它的 hasErrors()
方法是否存在任何验证错误。如果有,该方法结束时不处理 Taco,并返回 “design” 视图名,以便重新显示表单。
要对提交的 TacoOrder 对象执行验证,还需要对 OrderController 的 processOrder()
方法进行类似的更改。
程序清单 2.14 验证 POST 来的 TacoOrder
@PostMapping
public String processOrder(@Valid TacoOrder order, Errors errors) {
if (errors.hasErrors()) {
return "orderForm";
}
log.info("Order submitted: " + order);
return "redirect:/";
}
在这两种情况下,如果没有验证错误,则允许该方法处理提交的数据。如果存在验证错误,则请求将被转发到表单视图,以便用户有机会纠正其错误。
但是用户如何知道哪些错误需要改正呢?除非调出表单上的错误,否则用户将只能猜测如何成功提交表单。