使用 @Validated ,@Valid ,@NotBlank 之類的,請自行百度,本文着重與捕捉校驗失敗信息並封裝返回出去
參考:
https://mp.weixin.qq.com/s/EaZxYKyC4L_EofWdtyBCpw
https://www.jianshu.com/p/bcc5a3c86480
捕捉校驗失敗異常信息
@ControllerAdvice
public class WebExceptionHandler {
//處理Get請求中 使用@Valid 驗證路徑中請求實體校驗失敗后拋出的異常,詳情繼續往下看代碼
@ExceptionHandler(BindException.class)
@ResponseBody
public ResponseVO BindExceptionHandler(BindException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return new ResponseVO(message);
}
//處理請求參數格式錯誤 @RequestParam上validate失敗后拋出的異常是javax.validation.ConstraintViolationException
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public ResponseVO ConstraintViolationExceptionHandler(ConstraintViolationException e) {
String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
return new ResponseVO(message);
}
//處理請求參數格式錯誤 @RequestBody上validate失敗后拋出的異常是MethodArgumentNotValidException異常。
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ResponseVO MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return new ResponseVO(message);
}
}
如下示例請求參數報錯的話,會拋出 BindException 而不是 ConstraintViolationException 和 MethodArgumentNotValidException
@RestController
@RequestMapping("test")
public class TestController {
@GetMapping("refund")
public ResponseVO refund(@Valid RefundRequest request) throws Exception {
return new ResponseVO();
}
}
@Data
public class RefundRequest implements Serializable {
@NotBlank(message = "訂單號不能為空")
private String orderId;
@Min(value = 0, message = "已消費金額金額不能為負數")
private int orderAmt;
}
如果多個請求參數都校驗失敗,則遇到第一個校驗失敗就拋出異常,接下來的異常參數不做校驗,配置如下
@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;
}
}
