一、自定義修改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;
}
}
配置好後,重啓項目,看下效果
可以看到就只返回了一條檢驗失敗的提示。