SpringBoot專案中優雅處理引數校驗失敗資訊
阿新 • • 發佈:2021-01-02
技術標籤:SpringBootspring bootjava
在springboot專案中對前端請求的引數進行校驗常用的註解:
@NotBlank,@NotNull,@Valid
示例:
public class UserRequest {
@NotNull(message = "id不能為空")
private long id;
@NotBlank(message = "名字不能為空")
@Length(min = 1, max = 50, message = "名字名稱長度不能大於50")
@Pattern (regexp ="[0-9A-Z_\\-]+", message = "名字只能為數字和大寫字母組合")
private String name;
//省略get/set方法
}
要使引數校驗生效要注意其方法使用@Valid註解標註實體,如:
@PostMapping("/update")
public MyResponse updateRequest(@Valid @RequestBody UserRequest request) {
//業務邏輯xxx
return MyResponse. ok();
}
當請求中name欄位為空,系統會返回系統定義預設的異常,並沒有返回註解上列印的提示資訊
那如果將註解上對應的提示資訊進行返回給前端呢?
**
* 引數校驗 異常捕捉處理類
*/
@ControllerAdvice
public class WebExceptionHandler {
/**
* 請求引數格式錯誤 @RequestBody上valid失敗後丟擲的異常是MethodArgumentNotValidException異常;我們可以根據不同的異常類在系統中進行配置攔截處理
*/
@ExceptionHandler(MethodArgumentNotValidException. class)
@ResponseBody
public MyResponse MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
MyResponse re = new MyResponse();
re.setCode("500");
re.setMsg(message);
return re;
}
}
在呼叫更新介面檢視返回結果:
可以發現介面確實把校驗為通過的請求返回了,但是如果這個引數多個校驗都沒有通過,介面會校驗提示的資訊都返回,那如何只要有校驗失敗了,就結束返回呢?
新增一個配置類
package com.test;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import javax.validation.*;
/**
* 通過這個配置改成校驗引數時只要出現校驗失敗的情況,就立即丟擲對應的異常,結束校驗,不再進行後續的校驗
*/
@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;
}
}
在呼叫更新介面,介面返回如下:
這樣就可以返回一個具體校驗的引數給前端。