本文主要考虑对于bean validator的统一化定制,重点在于思路,而不在于实现,所以在实现过程中有不完整的地方请谅解
关于hibernate validator,距4.0发布到现在已经快2年了,它是属于jsr 303的一部分,即Bean Validator。在开发过程中,经常会对输入的数据进行验证,不同的框架有不同的验证方式,可以在每个需要验证的地方进行验证,也可以使用统一的验证方式进行工作。显然使用统一的方式进行验证很有吸引力,特别是对于在进行数据的save和update时,经常会使用相同的验证逻辑以及各种重复的代码进行验证,如果能进行统一化调用,则能够减少一大段的使用代码,提高开发效率。
首先,我们来看一个原来的验证方式,如下面的代码,这们需要对user对象的username和password进行验证,如下所示:
Asserts.assertTrue(StringUtils.hasText(getPassword()), Message.createMessage("user.password.empty"));
Asserts.assertTrue(StringUtils.hasText(getUsername()), Message.createMessage("user.username.empty"));
上面的代码,也已经是很简练的代码了,然而也需要写两行,加上其它的验证。光数据验证就得有一大段代码。然而,不幸的是,这段代码将在进行user对象的更新时,又写一次。因为,不能保证在进行更新时会使用和添加相同的逻辑,但总有大部分是相同的,这就不能避免同样的代码编写两次。
好了,当使用统一化的验证之后,代码变成如下形式:
validateBeanAdd();//这是对象添加验证
validateBeanUpdate(other);//这是对象更新验证
大部分(不是全部,因为与业务相关逻辑不能统一化)的验证逻辑都使用统一验证来代替了。所有的魔法都在于如何使用hibernate validator(以下使用jsr303代替)以及相应的分组验证,并将其整合到代码中。
首先,我们来确认验证时需要的元素信息
- 验证哪些信息(字段)
- 验证失败时的错误信息
- 什么时候需要验证
幸运地是,在jsr303中,以上的3个信息均有相应的对象。其中错误信息可以通过message来指定,而不同的验证条件则可以通过group分组进行划分。那么,统一验证的逻辑可以由如下描述:
- 对象保存时进行以保存为分组的验证条件进行验证
- 对象更新时进行以更新为分组的验证条件进行验证
@Column(unique = true, updatable = false, nullable = false)
那么,由上所示,修改后的user对象,可以这样来编写:
@NotNull(message="用户名不能为空", groups={Groups.Add.class,Groups.Update.class}
public String getUsername() {
return username;
}
@Column(name = "f_password")
@NotNull(message="密码不能为空", groups={Groups.Add.class,Groups.Update.class}
public String getPassword() {
return password;
}
在添加时,统一的验证即validateBeanAdd,即可以这样来编写:
protected final void validateBeanAdd() {
//使用validator进行判断
List<String> strList = ValidateUtils.validateBean(this, Groups.Add.class);
Asserts.assertTrue(strList.isEmpty(), Joins.join(strList, null));
}
当然,用了以上方法之后,每次验证调用一次validateBeanAdd也是不允许的,那么,我们可以写一个公共的保存方法,在此方法中调用validateBeanAdd,子类只需要重新其中可扩展的部分即可。
附:一个完整的实现,即User对象的save方法实现
首先是BaseDomain的save方法:
//保存方法
@Transactional //需要domain层事务 rich domain
public void save() {
//信息检查
boolean canAdd = canAdd();
Asserts.assertTrue(canAdd, getValidateMessage());
session.save(this);//hibernate session
}
//验证是否能添加方法
public boolean canAdd() {
validateBeanAdd();
message = validateAdd();
return message == null || !message.hasErrorMessage();//兼容旧写法;
}
//bean字段验证方法
protected final void validateBeanAdd() {
//使用validator进行判断
List<String> strList = ValidateUtils.validateBean(this, Groups.Add.class);
Asserts.assertTrue(strList.isEmpty(), Joins.join(strList, null));
}
//bean字段验证实现
public static List<String> validateBean(Entityable entityable, ValidateMessageFunction<String, String> function, Class<?> group) {
Set<ConstraintViolation<Entityable>> constraintViolationSet = validator.validate(entityable, group);
if(constraintViolationSet.isEmpty())
return Collections.emptyList();
List<String> validateList = Lists.newArrayList();
for(ConstraintViolation<Entityable> constraintViolation : constraintViolationSet) {
String message = constraintViolation.getMessage();
message = function == null ? message : function.apply(field, message);
validateList.add(message);
}
return validateList;
}
子类User只需要实现validateAdd即可,如下所示:public Message validateAdd() {
//业务逻辑验证,用户名惟一
if( hasUsername(getUsername()))
return Message.createMessage("user.username.exist", getUsername());
}
以上是一个参考实现,对于其它类,如基础数据的保存和修改,完全可以使用以上的方法,在实现中,只需要实现validateAdd即可,不用写save,在Action层只需要调用domain.save()即可,减少开发代码。
本文原自:http://www.iflym.com/index.php/code/201109070002.html 此处,增加具体的参考示例,希望对大家有所帮助。
分享到:
相关推荐
hibernate Validator 对hibernate内置约束条件 以及自定义约束条件的创建 都有很详细的说明 适合新手的学习 以及高手的巩固
Hibernate Validator的小例子,演示了最常用的几个注解以及验证方法,还是用了自定义的验证信息。 项目需求:Gradle构建工具,Eclipse或IDEA开发环境。
Hibernate Validator校验框架Demo基于springmvc
hibernate-validator用于验证对象属性。包含hibernate-validator-4.3.0.Final.jar、jboss-logging-3.1.0.CR2.jar、validation-api-1.0.0.GA.jar三个包
Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现
Hibernate Validator用Annotations 给类或者类的属性加上约束,在运行期...该框架是十分容易的(就像参考文档中宣称的那样),几乎没有什么学习曲线,Validator 是一个验证框架 不需要和Hibernate的其他部分绑定就可以使用
validation相关的jar包,包括hibernate-validator-4.3.0.Final.jar,jboss-logging-3.1.0.CR2.jar,validation-api.jar,validation-api-1.0.0.GA.jar
可以通过hibernatevalidator来验证数据合法性
hibernate validator 4.2的集成spring3.0.5一下版本的样例工程。 自己学习hibernate validator写的。 倘若使用spring3.1以上的版本,有些不同。其中MethodValidateInterceptor就是以spring3.1中的参考。 自己再研究...
hibernate validator reference 5 手册
hibernate-validator 5.3.5.Final jar包 ;desc:if you want validator your project
hibernate-validator相关依赖jar包,包括jboss-logging-3.1.0.CR2.jar,hibernate-validator-4.3.1.Final.jar,validation-api-1.0.0.GA.jar
JSR303 hibernate-validator-5.1.0.zip 进行数据格式;数据校验
hibernate-validator-6.0.2.Final-dist hibernate-validator-6.0.2.Final-dist hibernate-validator-6.0.2.Final-dist
我的博客中的《Spring MVC、hibernate validator和i18n》文章描述的项目的源代码,该文是对Spring mvc, validation和i18n的一个入门级的tutorial。我的博客地址是http://blog.csdn.net/zjysource
hibernate-validator注册用户登录验证实例已经得到亲测!亲测!亲测!
hibernate validator, 版本 5.1.2,可以直接导入到eclipse中。
hibernate-validator-4.0.1.GA-dist
《SpringMVC从入门到精通》SpringMVC使用hibernate-validator验证需要的jar包 包含hibernate-validator-5.1.0.Final hibernate-validator-annotation-processor-5.1.0.Final,等等都有
springmvc 使用hibernate-validator校验框架所需的校验包