java开发过程中遇到参数校验的坑,网上找的代码都是MethodArgumentNotValidException异常,而自己项目中打印的却是BindException异常,找了很多资料后发现不同请求类型抛出的校验异常是不同的,特此记录。如下:

1、validate不带@RequestBody和@RequestParam是BindException异常。
2、@RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。
3、@RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException异常。

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

评论列表

发表评论

您的电邮不会被公布,必填字段标记为*