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:/";
}

在这两种情况下,如果没有验证错误,则允许该方法处理提交的数据。如果存在验证错误,则请求将被转发到表单视图,以便用户有机会纠正其错误。

但是用户如何知道哪些错误需要改正呢?除非调出表单上的错误,否则用户将只能猜测如何成功提交表单。

results matching ""

    No results matching ""