解决:Hibernate-Validator仅仅返回第一条错误信息

本文介绍了一种在RESTful API中使用Hibernate Validator进行参数校验的方法。详细解释了如何通过自定义校验器来增强校验功能,并讨论了如何调整校验器配置以收集所有错误信息,而非仅第一个错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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);

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值