验证器(validate)
大约 5 分钟
验证器(validate)
开源领域已经存在hibernate.validation,我在使用的时候,总感觉是一个鸡肋,用他有很多不爽,不用,又没有一个很好的替代方案.所以这边就自己写了一个.
主要的不爽的地方如下
- hibernate-validation比较啰嗦而且偏low,比如说@Post和@Future,@Email
- hibernate-validation依赖了太多的框架,更新比较少,比如struts
代码集成
validation-api的maven依赖
<dependency>
<groupId>com.9istock.base</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0</version>
</dependency>validation-core的maven依赖
<dependency>
<groupId>com.9istock.base</groupId>
<artifactId>validation-core</artifactId>
<version>1.0.0</version>
</dependency>使用
spring配置
对于spring的配置来说,可以配置,也可以不配置
如果出现自定义标签的情况,一定要使用spring进行初始化
<bean class="com.istock.base.validation.Validator" factory-method="getInstance">
<property name="customHandler">
<set>
<bean class="com.istock.base.validation.DBCheckHander"></bean>
</set>
</property>
</bean>java调用
MaxModel model1 = new MaxModel();
Map<String,List<ValidResult>> result = Validator.getInstance().validate(model1, Validator.VALID_TYPE_ALL);Validator.VALID_TYPE_ALL:检查类中所有的属性,全部报出来 Validator.VALID_TYPE_SINGLE:检查类中属性,只要有一个报警就返回
注解说明
validation一共有如下注解
@Max
最大验证注解,当注解field的类型为数字/日期,验证值大小,当注解field的类型为string,验证长度
| 属性名 | 描述 |
|---|---|
| value | 最大值判断的依据值,会使用springEL进行执行 |
| message | 如果判断错误,展示的消息 |
| messageProperty | 使用国际化配置的property |
@Max注解的使用示例
//验证aaa的长度不能超过3
@Max(value = "3" ,message="${fieldName}的长度不能超过${value}")
public String aaa = "a";
//从属性bbbLength中获得校验值,属性bbb的长度不能超过12
public int bbbLength = 12;
@Max(value = "bbbLength")
public String bbb = "1234";
//属性age的值不能大于11
@Max(value = "11")
public Integer age = 1;
//属性age2的值不能大于属性bbbLength的值12
@Max(value = "bbbLength")
public Integer age2 = 11;
//属性dateField的日期不能晚于3017-11-11
//日期支持四种格式"yyyyMMdd","yyyyMMddHHmmss" , "yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"
@Max(value = "30171111")
public Date dateFiled = new Date();
//属性dateField的日期不能晚于dateFiled-1day
@Max(value = "T(org.apache.commons.lang3.time.DateUtils).addDays(dateFiled, -1)")
public Date targetDate = DateUtils.addDays(new Date(), -1);@Min
最小验证注解,当注解field的类型为数字/日期,验证值大小,当注解field的类型为string,验证长度
| 属性名 | 描述 |
|---|---|
| value | 最小值判断的依据值,会使用springEL进行执行 |
| message | 如果判断错误,展示的消息 |
| messageProperty | 使用国际化配置的property |
@Min注解的使用示例
//验证aaa的长度不能小于3
@Min(value = "3" ,message="${fieldName}的长度不能超过${value}")
public String aaa = "a";
//从属性bbbLength中获得校验值,属性bbb的长度不能小于12
public int bbbLength = 12;
@Min(value = "bbbLength")
public String bbb = "1234";
//属性age的值不能小于12
@Min(value = "11")
public Integer age = 1;
//属性age2的值不能小于属性bbbLength的值12
@Min(value = "bbbLength")
public Integer age2 = 11;
//属性dateField的日期不能早于3017-11-11
//日期支持四种格式"yyyyMMdd","yyyyMMddHHmmss" , "yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"
@Min(value = "30171111")
public Date dateFiled = new Date();
//属性dateField的日期不能早于dateFiled-1day
@Min(value = "T(org.apache.commons.lang3.time.DateUtils).addDays(dateFiled, -1)")
public Date targetDate = DateUtils.addDays(new Date(), -1);@NotNull
非空检查注解,注解所在的field为null时,会进行报警
| 属性名 | 描述 |
|---|---|
| message | 如果判断错误,展示的消息 |
| messageProperty | 使用国际化配置的property |
@PatternCheck
正则验证,注解所在的field必须为string类型,进行正则表达式检查
| 属性名 | 描述 |
|---|---|
| value | 正则表达式 |
| message | 如果判断错误,展示的消息 |
| messageProperty | 使用国际化配置的property |
| match | 告警模式,可选值 true,匹配正则表达式报警,false,不匹配正则表达式报警 |
@PatternCheck注解的使用示例
//邮箱验证,默认不匹配告警,如果注解字段的值不是邮箱格式,会告警
@PatternCheck(value="(\\p{Alpha}|[.,-_=+])+@(\\p{Alpha})+\\.(\\p{Alpha})+")
public String mail = "asdfv.asd@asdf.com";
//日期验证,默认不匹配告警,如果注解字段的值不是规定的日期,会告警
@PatternCheck(value="(?!0000)[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])")
public String date = "1992-10-10";
//纯数字验证,不匹配告警,如果注解字段的值不是数字,会告警
@PatternCheck(value="\\p{Alnum}+")
public String aa = "12324";@NestCheck
没有属性,当被检查对象的一个属性是另外一个对象,需要使用@NestCheck进行标识,否则不会检查
@NestCheck注解的使用示例
//仅仅用来告知验证器,这个注解需要被递归验证
@NestCheck
public MaxModel max = new MaxModel();
@NestCheck
public MinModel min= new MinModel();@Custom
自定义检查注解,用于验证器的扩展,匹配spring中的自定义验证器
| 属性名 | 描述 |
|---|---|
| validType | 最大值判断的依据值,会使用springEL进行执行 |
| message | 如果判断错误,展示的消息 |
| messageProperty | 使用国际化配置的property |
@Custom使用示例
//这个字段会调用自定义验证器,自定义验证器需要再spring配置中,配置customHandler
@Custom(validType="DB_CHECK")
public String name;格式化消息
配置的message和messageProperty不是一个静态内容,validation会返回特定的数据进行格式化.在message中,一共可以使用如下变量
| 变量名 | 说明 |
|---|---|
| value | 注解配置的value内容 |
| fieldName | 注解所在的field的名称 |
| fieldValue | 注解所在field的值 |
| referValue | 注解value在执行springEL以后的返回 |
变量替换示例
@Min(value = "3" ,message="${fieldName}的长度不能超过${value}")
public String aaa = "aaaaa";告警的消息为aaa的长度不能超过3
