Springboot配置捕捉validate校驗參數異常統一處理並自定義validate校驗返回格式

一、自定義修改validate校驗返回格式

@Valid ,@NotBlank,@NotNull是比較常用的參數校驗註解

但是validate參數校驗失敗後,返回的json數據可能並不是咱們最終想要的,下圖就是校驗失敗後它默認返回的數據

一般情況下,咱們可能只需要圖中標紅的那個提示信息就OK了

那怎麼改它的返回數據呢?

只要添加一個配置類就行了

/**
 * validate校驗 異常統一捕捉處理類
 */
@ControllerAdvice
public class WebExceptionHandler {

    /**
     * 處理請求參數格式錯誤 @RequestBody上validate失敗後拋出的異常是MethodArgumentNotValidException異常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public JsonData MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
        //下邊ResultCodeEnum.PARAMS_BS_ERROR.getCode()就是你自己自定義的返回code碼
        return JsonData.buildError(ResultCodeEnum.PARAMS_BS_ERROR.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.buildError(ResultCodeEnum.PARAMS_BS_ERROR.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.buildError(ResultCodeEnum.PARAMS_BS_ERROR.getCode(),message);
    }

}

配置完,看下效果

可以看到現在返回的數據已經是咱們自定義的數據了

二、配置只要出現校驗失敗的情況,就拋出異常,結束校驗,不再進行後續的校驗

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;
    }

}

配置好後,重啓項目,看下效果

可以看到就只返回了一條檢驗失敗的提示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章