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的一些不足
- 没有很好地按顺序对实体类字段校验的支持,例如:先校验用户名,再校验手机号
- 因为部分校验格式在实体类里面,所以要保证实体类字段上面的注解不能丢失