返回介绍

7.6 Controller 类

发布于 2025-04-22 20:10:00 字数 2320 浏览 0 评论 0 收藏

在 Controller 类中通过实例化 validator 类,可以使用 Spring 验证器。清单 7.5 中 Product- Controller 类的 saveProduct 方法创建了一个 ProductValidator,并调用其 validate 方法。为了检验该验证器是否生成错误消息,需在 BindingResult 中调用 hasErrors 方法。

清单 7.5 ProductController 类

package controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import domain.Product;
import validator.ProductValidator;

@Controller
public class ProductController {

  private static final Log logger = LogFactory
      .getLog(ProductController.class);

  @RequestMapping(value = "/add-product")
  public String inputProduct(Model model) {
    model.addAttribute("product", new Product());
    return "ProductForm";
  }
  @RequestMapping(value = "/save-product")
  public String saveProduct(@ModelAttribute Product product,
      BindingResult bindingResult, Model model) {
    ProductValidator productValidator = new ProductValidator();
    productValidator.validate(product, bindingResult);

    if (bindingResult.hasErrors()) {
      FieldError fieldError = bindingResult.getFieldError();
      logger.debug("Code:" + fieldError.getCode() + ", field:"

          + fieldError.getField());

      return "ProductForm";
    }

    // save product here

    model.addAttribute("product", product);
    return "ProductDetails";
  }
}

使用 Spring 验证器的另一种方法是:在 Controller 中编写 initBinder 方法,并将验证器传到 WebDataBinder,并调用其 validate 方法。

@org.springframework.web.bind.annotation.InitBinder
public void initBinder(WebDataBinder binder) {
  // this will apply the validator to all request-handling methods
  binder.setValidator(new ProductValidator());
  binder.validate();
}

将验证器传到 WebDataBinder,会使该验证器应用于 Controller 类中所有处理请求的方法。

或者利用 @javax.validation.Valid 对要验证的对象参数进行注解。例如:

public String saveProduct(@Valid @ModelAttribute Product product,
    BindingResult bindingResult, Model model) {

Valid 注解类型是在 JSR 303 中定义的。关于 JSR 303 的相关信息,7.8 节将会讨论。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。