- 内容提要
- 作者简介
- 译者简介
- 前言
- HTTP
- Servlet 和 JSP
- 下载 Spring 或使用 STS 与 Maven/Gradle
- 手动下载 Spring
- 使用 STS 和 Maven/Gradle
- 下载 Spring 源码
- 本书内容简介
- 下载示例应用
- 第 1 章Spring 框架
- 第 2 章模型 2 和 MVC 模式
- 第 3 章Spring MVC 介绍
- 第 4 章基于注解的控制器
- 第 5 章数据绑定和表单标签库
- 第 6 章转换器和格式化
- 第 7 章验证器
- 第 8 章表达式语言
- 第 9 章JSTL
- 第 10 章国际化
- 第 11 章上传文件
- 第 12 章下载文件
- 第 13 章应用测试
- 附录 A Tomcat
- 附录 B Spring Tool Suite 和 Maven
- 附录 C Servlet
- 附录 D JavaServer Pages
- 附录 E 部署描述符
7.9 JSR 303 Validator 范例
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 类。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论