Bean Validation-------JAVA BEAN 数据验证功能java
数据验证在 Java 分层结构的应用开发中占据着重要位置。Java EE 6 提出了 Bean Validation 规范,使用注解的方式对 Java Bean 进行约束验证,不局限于某一层次或者某一编程模型,灵活易用。而今天,咱们就去学习java中的数据验证功能之Bean Validation。spring
首先咱们来介绍一下Bean Validation。编程
Bean是java bean,是咱们抽象出来的对象。如用户对象,这个对象确定包含不少信息,如用户名,密码,权限等等信息。在实际的开发中,用户的登陆验证,权限控制等是咱们不得不关注的问题。举个例子,如用户登陆功能,咱们不但要在前台执行验证,在服务层后台一样也须要对用户信息进行验证。若是咱们每进行一次业务操做,都须要去写一段验证的代码,这样无疑是很是累赘和易出错的。api
Bean Validation 规范的目标就是避免多层验证的重复性。事实上,开发者更倾向于将验证规则直接放到 Java Bean 自己,使用注解的方式进行验证规则的设计。app
JSR303 规范(Bean Validation 规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式。该规范主要使用注解的方式来实现对 Java Bean 的验证功能,而且这种方式会覆盖使用 XML 形式的验证描述符,从而使验证逻辑从业务代码中分离出来。学习
接下来简单学习api和基本用法。因为springui
Spring 4.0 默认即支持Bean Validation 1.0 (JSR-303)和 Bean Validation 1.1(JSR-349)校验规范, 同时也能适配Spring的Validator校验接口。spring提供了数据绑定对象DataBinder,所谓的数据绑定就是自动把用户输入的数据自动绑定到咱们用于处理用户数据逻辑的对象。在Spring中 Validator 和 Binder构成了Validation包.this
首先查看一下spring的validator包下面的包结构编码
在这个包中第一个要用到的就是Validator接口,该接口提供数据验证的方法。接下来看一下Vlidator接口的源码:spa
package org.springframework.validation; public interface Validator { /**是否为能够验证的类型*/ boolean supports(Class<?> clazz); /**数据验证方法*/ void validate(Object target, Errors errors); }
方法:supports(Class) - 判断该Validator是否能校验提供的Class的实例?
方法:validate(Object, org.springframework.validation.Errors) - 校验给定的对象,若是有校验失败信息,将其放入Errors对象。
咱们写一个简单的bean,演示一下Validitor接口的使用。
一个article对象,代码以下:
public class Article { private long id; private String name; private String content; private Date publishTime; private Date lastUpdateTime; private User author; private ArticleType articleType; // ... 省略其余属性 // ... omit other attributes // ... omit getter and setter methods }
而后为article类设置一个校验器,用来校验用户的artile是否知足规则
/** * @Author Wang Weiwei * @Since 16-10-13 * @Describe * The validator of article */ public class ArticleValitors implements Validator { /**this validator is only fit to the article type*/ public boolean supports(Class<?> clazz) { if (Article.class.equals(clazz)){ return true; } return false; } public void validate(Object target, Errors errors) { Article article = (Article) target; ValidationUtils.rejectIfEmptyOrWhitespace(errors,"title","field.required"); ValidationUtils.rejectIfEmptyOrWhitespace(errors,"content","field.required"); if (article.getTitle().length() > 100){ errors.rejectValue("title","too.long.article"); //...omit... } }
ArticleValidator校验器只能校验类型为Article类型的数据对象,且在此对象中title不能为空,content属性也不能为空,title的长度也必须小于100,不然校验器会报错,并将错误信息存放到errors对象当中。经过这个校验器咱们就能实现对article类型的简单的校验了。
前面咱们谈到数据绑定和数据校验。如何拿到校验错误信息是咱们最后须要讨论的一个问题。在上面的例子中,
咱们拒绝了`title`和`content`属性。若是咱们想要输出校验错误的提示信息,就要用到校验失败时设置的错误编码(本例中就是'title'和'content')。
当你调用`Errors`接口中的`rejectValue`方法或者它的任何一个方法,它的优先实现不单单会注册做为参数传入进来的错误编码,
还会注册一些遵循必定规则的错误编码。注册哪些规则的错误编码取决于你使用的`MessageCodesResolver`。当咱们使用默认的`DefaultMessageCodesResolver`
时,除了会将错误信息注册到你指定的错误编码上以外,这些错误信息还会注册到包含属性名的错误编码上。假如你调用这样一个方法`rejectValue("title", "too.long.article")`,
Spring除了会注册`too.darn.old`这个错误编码外,还会注册`too.darn.old.age`和`too.darn.old.age.int`这两个错误编码(即一个是包含属性名,另一个既包含属性名还包含
类型);这在Spring中做为一种约定,这样全部的开发者都能按照这种约定来定位错误信息了。
休息一会,等会去写spring中bean的装饰器BeanWrapper