使用Hibernate Validator 进行入参校验,在网上搜了一大堆都是应用在控制层,由于前端插件的高度封装,在后台控制层进行参数校验已经很鸡肋。
项目中已有的入参校验是利用反射机制,对指定参数(硬编码参数名)进行逻辑校验,如果实体类参数名改变那么相应的业务层方法也要改动;另外对boolean类型的参数利用反射机制进行校验显得也很被动(isField(),不是getField())。
业务中通常情景很多,使用Hibernate Validator 的分组功能在服务层的入参校验还是比较灵活的。
1.入参校验工具类:
package com.xxx.xxx.cod.util;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.StringUtil;
import org.apache.shiro.util.CollectionUtils;
import org.hibernate.validator.HibernateValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
/**
* 入参校验工具类
*/
public class ParamValidateUtil {
private static final Logger logger = LoggerFactory.getLogger(ParamValidateUtil.class);
/**
* 使用hibernate的注解来进行验证
*/
private static Validator validator = Validation.byProvider(HibernateValidator.class).
configure().failFast(false).buildValidatorFactory().getValidator();
//failFast(true)遇到一个错误信息便返回;failFast(false)校验完所有参数后才返回
/**
* 不需要校验有分组的参数时,只需传入obj
* 如果要校验指定分组的参数时,需要传入obj和var(分组interface)
*/
public static <T> JSONObject validate(T obj,Class...var) {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj,var);
JSONObject jsonObject = new JSONObject();
StringBuilder errorSB = new StringBuilder("");
if (!CollectionUtils.isEmpty(constraintViolations)) {
for (ConstraintViolation<T> cv : constraintViolations) {
errorSB.append(cv.getMessage());
}
logger.error(errorSB.toString());
}
if (StringUtil.isNotEmpty(errorSB.toString())) {
jsonObject.put("code", 1);
jsonObject.put("message", errorSB.toString());
} else {
jsonObject.put("code", 0);
}
return jsonObject;
}
}
2.测试类:
public static void main(String[] args) {
ParamVO paramVO = new ParamVO();
paramVO.setUserName("admin");
paramVO.setAge(null);
paramVO.setStudentNo("123");
paramVO.setQuantity(1);
paramVO.setWeight(100);
//校验没有分组的参数
JSONObject jsonObject = ParamValidateUtil.validate(paramVO);
//只校验指定分组的参数(这里不贴实体类了,PassFlagCheck是ParamVO类的内部接口,用于分组)
//JSONObject jsonObject = ParamValidateUtil.validate(paramVO, ParamVO.PassFlagCheck.class);
System.out.println("jsonObject = " + jsonObject);
}