JSR 303 - Bean Validation 介绍及最佳实践
2012-03-20 15:32:26 来源:WEB开发网public class Product { // 必须非空 @NotEmpty private String productName; // 必须在 8000 至 10000 的范围内 // @Price 是一个定制化的 constraint @Price private float price; … Getter 和 setter } |
清单 3. OrderQuery.java
// 'to'所表示的日期必须在'from'所表示的日期之后 // @QueryConstraint 是一个定制化的 constraint @QueryConstraint public class OrderQuery { private Date from; private Date to; … omitted … Getter and setter } |
定制化的 constraint
@Price是一个定制化的 constraint,由两个内置的 constraint 组合而成。
清单 4. @Price 的 annotation 部分
// @Max 和 @Min 都是内置的 constraint @Max(10000) @Min(8000) @Constraint(validatedBy = {}) @Documented @Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface Price { String message() default "错误的价格"; Class[] groups() default {}; Class[] payload() default {}; } |
@Status是一个新开发的 constraint.
清单 5. @Status 的 annotation 部分
@Constraint(validatedBy = {StatusValidator.class}) @Documented @Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface Status { String message() default "不正确的状态 , 应该是 'created', 'paid', shipped', closed'其中之一"; Class[] groups() default {}; Class[] payload() default {}; } |
清单 6. @Status 的 constraint validator 部分
public class StatusValidator implements ConstraintValidator |
Bean Validation API 使用示例
创建订单
用户在创建一条订单记录时,需要填写以下信息:订单编号,客户,电子信箱,地址,状态,产品名称,产品价格
对这些信息的校验,使用 Bean Validation API
如果用户不填写任何信息提交订单,相应的错误信息将会显示在页面上
其实在整个程序的任何地方都可以调用 JSR 303 API 去对数据进行校验,然后将校验后的结果返回。
…
结束语
JSR 303 的发布使得在数据自动绑定和验证变得简单,使开发人员在定义数据模型时不必考虑实现框架的限制。当然 Bean Validation 还只是提供了一些最基本的 constraint,在实际的开发过程中,用户可以根据自己的需要组合或开发出更加复杂的 constraint
图 3. 创建订单
清单 7. 代码片段
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpSession session = req.getSession();
// 从 request 中获取输入信息
String orderId = (String) req.getParameter("orderId");
String customer = (String) req.getParameter("customer");
String email = (String) req.getParameter("email");
String address = (String) req.getParameter("address");
String status = (String) req.getParameter("status");
String productName = (String) req.getParameter("productName");
String productPrice = (String) req.getParameter("productPrice");
// 将 Bean 放入 session 中
Order order = new Order();
order.setOrderId(orderId);
order.setCustomer(customer);
order.setEmail(email);
order.setAddress(address);
order.setStatus(status);
order.setCreateDate(new Date());
Product product = new Product();
product.setName(productName);
if(productPrice != null && productPrice.length() > 0)
product.setPrice(Float.valueOf(productPrice));
order.setProduct(product);
session.setAttribute("order", order);
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set
图 4. 验证后返回错误信息
清单 8. 调用 JSR 303 API 进行校验
Order order = new Order();
…
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set
Tags:JSR Bean Validation
编辑录入:爽爽 [复制链接] [打 印]- ››JSR 303 - Bean Validation 介绍及最佳实践
- ››JSR 286 Portlet 的新特性,第 1 部分: Portlet 2...
- ››JSR 286 Portlet 的新特性,第 2 部分: 资源服务、...
- ››JSR 286 Portlet 的新特性,第 3 部分: Portlet 过...
- ››BeanShell---Java应用程序脚本引挚
- ››bean里面如何打印到html页面
- ››Bean和Servlet的企业应用
- ››JSR 198最终草案提交 统一IDE插件标准
- ››JSR 224-Java EE 5 最终草案发布
- ››JSR-220:EJB 3.0 提交最终草案
- ››Beans入门必读之为Beans增加功能
- ››Beans入门必读之实体bean介绍
更多精彩
赞助商链接