java bean 属性验证框架 valid
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
项目介绍
java 开发中,参数校验是非常常见的需求。
但是 hibernate-validator 在使用过程中,依然会存在一些问题。
特性
•支持 fluent-validation
•支持 jsr-303 注解
•支持 i18n
•支持用户自定义策略
•支持用户自定义注解
开源地址
valid
创作目的
hibernate-validator 无法满足的场景
如今 java 最流行的 hibernate-validator 框架,但是有些场景是无法满足的。比如:
1.验证新密码和确认密码是否相同。(同一对象下的不同属性之间关系)
2.当一个属性值满足某个条件时,才进行其他值的参数校验。
3.多个属性值,至少有一个不能为 null
其实,在对于多个字段的关联关系处理时,hibernate-validator 就会比较弱。本项目结合原有的优点,进行这一点的功能强化。
validation-api 过于复杂
validation-api 提供了丰富的特性定义,也同时带来了一个问题。
实现起来,特别复杂。
然而我们实际使用中,常常不需要这么复杂的实现。
valid-api 提供了一套简化很多的 api,便于用户自行实现。
自定义缺乏灵活性
hibernate-validator 在使用中,自定义约束实现是基于注解的,针对单个属性校验不够灵活。
本项目中,将属性校验约束和注解约束区分开,便于复用和拓展。
过程式编程 vs 注解式编程
hibernate-validator 核心支持的是注解式编程,基于 bean 的校验。
一个问题是针对属性校验不灵活,有时候针对 bean 的校验,还是要自己写判断。本项目支持 fluent-api 进行过程式编程,同时支持注解式编程。
尽可能兼顾灵活性与便利性。
项目模块说明
模块名称说明
valid-api 核心 api 及注解定义
valid-core 针对 valid-api 的核心实现
valid-jsr 针对 JSR-303 标准注解的实现
valid-test 测试代码模块
依赖说明
valid-core 默认引入 valid-api
valid-jsr 默认引入 valid-core
快速开始
准备工作
JDK1.7+
Maven 3.X+
maven 引入
例子
我们直接利用 jsr 内置的约束类:
public void helloValidTest() {
IResult result = ValidBs.on(null, JsrConstraints.notNullConstraint ())
.result()
.print();
Assert.assertFalse(result.pass());
}
对应日志输出为:
DefaultResult{pass=false, notPassList=[DefaultConstraintResult{pass=fal se, message='预期值为
方法初步说明
ValidBs 用来进行验证的引导类,上述的写法等价于如下:
public void helloValidAllConfigTest() {
IResult result = ValidBs.on(null, JsrConstraints.notNullConstraint ())
.fail(Fails.failFast())
.group()
.valid(DefaultValidator.getInstance())
.result()
.print();
Assert.assertFalse(result.pass());
}
on(Object value, IConstraint… constraints) 指定约束
Object 可以是对象,也可以是普通的值。
constraints 为对应的约束列表,为默认的约束验证提供便利性。
IConstraint 相关创建工具类Constraints、JsrConstraints
fail(IFail fail)
可以指定失败时的处理策略,支持用户自定义失败策略。
实现说明
failOver 失败后继续验证,直到验证完所有属性
failFast 失败后快速返回
group(Class[] classes) 支持分组验证
有时候我们希望,只验证指定某一分组的约束。
可以通过 group() 属性指定,与 IConstraint 中的 group() 属性匹配的约束才会被执行。
valid(IValidator validator) 支持验证策略
默认为 DefaultValidator,为 valid-api 的实现验证。
如果你希望使用 jsr-303 注解,可以使用JsrValidator。
支持自定义验证策略。
result(IResultHandler resultHandler) 验证结果处理
默认为 simple() 的简单结果处理。
可以指定为 detail() 进行详细结果处理查看。
支持用户自定义结果处理策略。
IResult 内置方法
simple()/detail() 处理的结果为 IResult 实现类。
IResult 支持如下方法:
•print()
对结果进行打印,主要便于调试。
•throwEx()
对于参数的校验,一般都是基于异常结合 spring aop来处理的。
throwsEx 会在验证不通过时,抛出 ValidRuntimeException 异常,对应 message 为提示消息。
@Test(expected = ValidRuntimeException.class)
public void resultThrowsExTest() {
ValidBs.on(null, notNullValidatorEntry())
.valid()
.result()
.throwsEx();
}