参数校验异常处理

统一参数校验异常需要注意:不同类型的参数抛出的异常是不一样的。

  • MethodArgumentNotValidException
  • BindException

Json格式参数

当Springboot入参为json,如使用@RequestBody则校验异常抛出为MethodArgumentNotValidException

示例:

Controller(有@RequestBody)

1
2
3
4
@PostMapping("/token")
public ResultVO token(@Validated @RequestBody OauthTokenDTO oauthTokenDTO){
return ResultVO.ok();
}

OauthTokenDTO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Data
public class OauthTokenDTO {
/**
* 登录名
*/
@NotEmpty(message = "登录名不能为空")
private String loginName;
/**
* 登录密码
*/
@NotEmpty(message = "登录密码不能为空")
private String password;

}

统一异常捕获@RestControllerAdvice类中捕获处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 校验参数异常统一处理
*
* @param e
* @return
* @Validated @RequestBody 一起的时候抛出此异常
* https://github.com/spring-projects/spring-framework/issues/14790
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultVO handleMethodArgumentNotValid(MethodArgumentNotValidException e) {
log.error("参数校验异常", e);
BindingResult bindingResult = e.getBindingResult();
StringBuilder stringBuilder = new StringBuilder();
for (FieldError error : bindingResult.getFieldErrors()) {
String field = error.getField();
Object value = error.getRejectedValue();
String msg = error.getDefaultMessage();
String message = String.format("错误字段:%s,错误值:%s,原因:%s;", field, value, msg);
stringBuilder.append(message).append("\r\n");
}
return ResultVO.failed(stringBuilder.toString());
}

非Json格式参数

入参不是json格式,我们不会使用@RequestBody,此时抛出异常为BindException

示例:

Controller(无@RequestBody)

1
2
3
4
@PostMapping("/token")
public ResultVO token(@Validated OauthTokenDTO oauthTokenDTO){
return ResultVO.ok();
}

OauthTokenDTO(同上)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Data
public class OauthTokenDTO {
/**
* 登录名
*/
@NotEmpty(message = "登录名不能为空")
private String loginName;
/**
* 登录密码
*/
@NotEmpty(message = "登录密码不能为空")
private String password;

}

统一异常捕获@RestControllerAdvice类中捕获处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 校验参数异常统一处理
*
* @param e
* @return
* @Validated 没有@RequestBody时候抛出此异常
* https://github.com/spring-projects/spring-framework/issues/14790
*/
@ExceptionHandler(BindException.class)
public ResultVO handleBindException(BindException e) {
log.error("参数校验异常", e);
BindingResult bindingResult = e.getBindingResult();
return ResultVO.failed().msg(bindingResult.getFieldError().getDefaultMessage());
}

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×