hibernate-validator简介
hibernate-validator是Hibernate项目中的一个数据校验框架,是Bean Validation 的参考实现,hibernate-validator除了提供了JSR 303规范中所有内置constraint 的实现,还有一些附加的constraint 。使用hibernate-validator能够将数据校验从业务代码中脱离出来,增加代码可读性,同时也让数据校验变得更加方便、简单。
数据校验背景介绍
Java程序开发中,当你要处理一个程序的业务逻辑时,请求参数的数据校验是必须要处理的。当请求参数格式不正确的时候,需要程序监测到,并且返回对应的错误提示,以此来达到数据校验的目的。对于前后端分离开发过程中,数据校验还需要返回对应的状态码和错误提示信息。
hibernate-validator实践
添加Maven依赖支持
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
数据校验工具类
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.hibernate.validator.HibernateValidator;
import com.jy.enums.BizExceptionEnum;
import com.jy.exception.PCBizException;
/**
* 接口入参数据校验工具类.<br/>
* 使用hibernate-validator进行校验.<br/>
*
* @Null 被注释的元素必须为 null
* @NotNull 被注释的元素必须不为 null
* @AssertTrue 被注释的元素必须为 true
* @AssertFalse 被注释的元素必须为 false
* @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
* @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
* @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
* @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
* @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
* @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
* @Past 被注释的元素必须是一个过去的日期
* @Future 被注释的元素必须是一个将来的日期
* @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
* Hibernate Validator 附加的 constraint
* @NotBlank(message =) 验证字符串非null,且长度必须大于0
* @Email 被注释的元素必须是电子邮箱地址
* @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
* @NotEmpty 被注释的字符串的必须非空
* @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
*
*/
public class ValidationUtils {
/**
* 使用hibernate的注解来进行验证
*/
private static Validator validator = Validation
.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();
/**
* 功能描述: <br>
* 〈注解验证参数〉
*
* @param obj
*/
public static <T> void validate(T obj) {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
// 抛出检验异常
if (constraintViolations.size() > 0) {
PCBizException e = new PCBizException(BizExceptionEnum.REQUEST_PARAM_ERROR.getIndex(), String.format(constraintViolations.iterator().next().getMessage()));
e.setInfo(constraintViolations.iterator().next().getPropertyPath()); // 字段校验未通过的字段名称
throw e;
}
}
}
实体类添加hibernate-validator注解,限定参数格式
public class UserEntity implements Serializable {
@NotEmpty(message = "用户名不能为空")
private String username;
@NotEmpty(message = "手机号不能为空")
@Pattern(regexp = "^1[3|4|5|7|8][0-9]\\d{8}$", message = "手机号格式不正确")
private String phone;
get and set...
}
业务逻辑层调用hibernate-validator进行数据校验
@Service("userService")
public class UserServiceImpl implements UserService {
public String saveUser(UserEntity user) {
// 调用hibernate-validator数据校验
ValidationUtils.validate(user);
// 调用dao保存用户信息
return "success";
}
}
如果数据校验失败,就会抛出异常,可以通过springMVC自定义异常拦截器,拦截异常,并返回给前端对应的异常信息,比如用户名不能为空。
以上设计针对前后端分离项目开发过程中,方便在数据格式不正确后校验信息返回,hibernate-validator框架根据需求不同,实现方式的不同,使用方式也不尽相同,但最终都能达到数据校验的目的。更为详细的使用还需要看官方文档http://hibernate.org/validator/releases/
hibernate-validator的一些不足
- 没有很好地按顺序对实体类字段校验的支持,例如:先校验用户名,再校验手机号
- 因为部分校验格式在实体类里面,所以要保证实体类字段上面的注解不能丢失
版权声明:本文为weixin_37162010原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。