Java服务端接口参数校验框架——hibernate-validator使用

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


猜你喜欢

转载自blog.csdn.net/weixin_37162010/article/details/80252154
今日推荐