代码(全局异常处理器类里面):
/**
* 处理数据校验异常
* 处理配合@requestBody产生的数据校验异常
*
* @author 王子龙
* @date 2020-8-30 21:34
* @param e 数据校验异常
* @return com.centerm.util.ResponseTemplate
**/
@ExceptionHandler({BindException.class,MethodArgumentNotValidException.class})
@ResponseBody
public ResponseTemplate bindExceptionHandler(Exception e) {
BindingResult result;
if (e instanceof BindException) {
result = ((BindException) e).getBindingResult();
} else {
result = ((MethodArgumentNotValidException) e).getBindingResult();
}
Map<String, String> messages = new HashMap<>(16);
// 遍历所有字段的异常信息
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
for (ObjectError error : errors) {
FieldError fieldError = (FieldError) error;
// 判断是否是某个字段转换失败
if (fieldError.isBindingFailure()) {
messages.put(fieldError.getField(), "数据格式非法!");
}
else {
messages.put(fieldError.getField(), fieldError.getDefaultMessage());
}
}
}
return ResponseTemplate.error("数据校验出错!", messages);
}
注:
- BindException是@Validation单独使用校验失败时产生的异常
- MethodArgumentNotValidException是@RequestBody和@Validated配合时产生的异常,比如在传参时如果前端的json数据里部分缺失@RequestBody修饰的实体类的属性就会产生这个异常。
- ResponseTemplate类只是返回前端的数据格式化的类,本例子中不重要。
结果: