返回介绍

7.9 JSR 303 Validator 范例

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

jsr303-validator 应用程序展示了 JSR 303 输入验证的例子。这个应用程序是对 spring- validator 进行修改之后的版本,与之前的版本有一些区别。首先,它没有 ProductValidator 类。其次,来自 Hibernate Validator 库的 jar 文件已经被添加到了 WEB-INF/lib 中。

清单 7.6 Product 类的 name 和 productionDate 字段已经用 JSR 303 注解类型进行了注解。

清单 7.6 Product 类

package domain;
import java.io.Serializable;
import java.math.BigDecimal
import java.time.LocalDate;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

public class Product implements Serializable {
  private static final long serialVersionUID = 78L;

  @Size(min=1, max=10)
  private String name;

  private String description;
  private BigDecimal price;

  @Past
  private LocalDate productionDate;

  // getters and setters not shown
}

在 ProductController 类的 saveProduct 方法中,必须用 @Valid 对 Product 参数进行注解,如清单 7.7 所示。

清单 7.7 ProductController 类

package controller;
import javax.validation.Valid;
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;

@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(@Valid @ModelAttribute Product product,
      BindingResult bindingResult, Model model) {

    if (bindingResult.hasErrors()) {
      FieldError fieldError = bindingResult.getFieldError();
      logger.info("Code:" + fieldError.getCode() + ", object:"
          + fieldError.getObjectName() + ", field:"
          + fieldError.getField());
      return "ProductForm";
     }

     // save product here

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

为了定制来自验证器的错误消息,要在 messages.properties 文件中使用两个键。messages.properties 文件如清单 7.8 所示。

清单 7.8 jsr303-validator 中的 messages.properties 文件

productName.required.product.name=Please enter a product name
price.required=Please enter a price
price.negative=Price cannot be less than 0 
productionDate.required=Please enter a production date
productionDate.invalid=Please ensure the production date is not later 
→than today
typeMismatch.productionDate=Invalid production date 
Past.productionDate=Production date must be a past date 

要想测试 jsr303-validator 中的验证器,可以在浏览器中打开以下网址:

http://localhost:8080/jsr303-validator/add-product

请注意,在编写本书时,最新版本(版本 5.2.4)的 Hibernate Validator 仍然无法验证使用 @Past 或 @Future 注解的 LocalDate 或 LocalDateTime 类型的字段。因为 LocalDate 是 Date / Time API 中的新类型,应该用来代替 java.util.Date。 因此,这个项目包含一个自定义验证器和重写过的 Hibernate 验证器的 ConstraintHelper 类。

发布评论

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