统一参数校验异常需要注意:不同类型的参数抛出的异常是不一样的。
- 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();
}
OauthTokenDTO1
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());
}