Springboot配置捕捉validate校验参数异常统一处理并自定义validate校验返回格式

一、自定义修改validate校验返回格式

@Valid ,@NotBlank,@NotNull是比较常用的参数校验注解

但是validate参数校验失败后,返回的json数据可能并不是咱们最终想要的,下图就是校验失败后它默认返回的数据

一般情况下,咱们可能只需要图中标红的那个提示信息就OK了

那怎么改它的返回数据呢?

只要添加一个异常处理类就行了

/**
 * validate校验 异常统一捕捉处理类
 */
@ControllerAdvice
public class WebExceptionHandler {

    /**
     * 处理请求参数格式错误 @RequestBody上使用@Valid 实体上使用@NotNull等,验证失败后抛出的异常是MethodArgumentNotValidException异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public JsonData MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
        return JsonData.buildCodeAndMsg(BASE_VAILD_EXCEPTION.getCode(),message);
    }

    /**
     * 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
     */
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public JsonData BindExceptionHandler(BindException e) {
        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
        return JsonData.buildCodeAndMsg(BASE_VAILD_EXCEPTION.getCode(),message);
    }

    /**
     * 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException
     */
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    public JsonData ConstraintViolationExceptionHandler(ConstraintViolationException e) {
        String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
        return JsonData.buildCodeAndMsg(BASE_VAILD_EXCEPTION.getCode(),message);
    }

    /**
     * 参数格式异常
     */
    @ExceptionHandler(HttpMessageNotReadableException.class)
    @ResponseBody
    public JsonData HttpMessageNotReadableExceptionHandler(HttpMessageNotReadableException e) {
        return JsonData.buildCodeAndMsg(BASE_VAILD_EXCEPTION.getCode(),"参数格式异常");
    }


}

配置完,看下效果

可以看到现在返回的数据已经是咱们自定义的数据了

二、配置校验快速失败:只要出现校验失败的情况,就结束校验,不再进行后续的校验

validate参数校验默认的是一个参数校验失败后,还会继续校验后面的参数,如下图,它会返回多个信息

但是实际情况一般是只要有一个参数校验失败了,就结束返回。那怎么改成想要的这样呢?

很简单,也是加一个配置类就好了(但是有的版本是不生效的)

/**
 * validate参数校验默认的是一个参数校验失败后,还会继续校验后面的参数
 * 通过这个配置改成:校验参数时只要出现校验失败的情况,就立即抛出对应的异常,结束校验,不再进行后续的校验
 */
@Configuration
public class WebConfig {

    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                //failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。
                .failFast(true)
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
        methodValidationPostProcessor.setValidator(validator());
        return methodValidationPostProcessor;
    }

}

配置好后,重启项目,看下效果

 可以看到就只返回了一条检验失败的提示。

觉得对你有帮助的话,可以点个关注,点个赞,3Q~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曹举的个人博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值