在RESTful中使用Hibernate-Validator的时候,都是这样一种方法使用。或者类似的方式进行异常校验。我也是参照了别人的文档这么写的。
/**
* 接口入参数据校验工具类.
* 使用hibernate-validator进行校验.
* 其中加入自定义的校验器
*
* @author wuss45
* @date 2018年10月19日-17时08分
*/
public class ValidationUtil {
private static final Logger logger = LoggerFactory.getLogger(ValidationUtil.class);
/**
* 使用hibernate的注解来进行验证
*/
private static Validator validator = Validation
.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();
/**
* 默认校验器校验
*
* @param obj
*/
public static <T> Result defaultValidate(T obj) {
logger.info("开始对类型{}进行校验", obj.getClass());
try {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
if (constraintViolations.size() > 0) {
String message = constraintViolations.iterator().next().getMessage();
logger.warn("存在不在异常枚举中的异常:{}", message);
return ResponseUtil.operateFail(999999, message);
}
logger.info("表单校验通过");
return null;
} catch (Exception ex) {
Throwable cause = ex.getCause();
//判断异常类型,业务异常包装一下再返回
if (cause instanceof SpecialException) {
ExceptionEnum exceptionEnum = ((SpecialException) cause).getExceptionEnum();
logger.warn("对表单类{}校验存在异常:{}", obj.getClass(), exceptionEnum.getMessage());
return ResponseUtil.operateFail(exceptionEnum.getCode(), exceptionEnum.getMessage());
}
logger.error("系统错误");
return null;
}
}
}
但是这样写你会发现,Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);中的constraintViolations只是包含一个错误信息。
究其原因,上面的代码是构建校验器的时候传递的参数配置决定的。我们来看:private static Validator validator = Validation
.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();
代码" .failFast(true) " ,当参数为true的时候,遇到一次个错误信息就会返回。我要获取全部的错误信息,需要把这个true改为false。
我们来看一下这个方法的源码注释:
/**
* En- or disables the fail fast mode. When fail fast is enabled the validation
* will stop on the first constraint violation detected.
*
* @param failFast {@code true} to enable fail fast, {@code false} otherwise.
*
* @return {@code this} following the chaining method pattern
*/
HibernateValidatorConfiguration failFast(boolean failFast);