全局异常处理,对于每个后台来说很重要,下边记录springboot中的全局异常处理。
处理全局异常,只需要创建一个处理全局异常的类,添加几个注解和错误的处理逻辑即可,剩下的交给springboot,当对应的类型出现异常,会被捕获到,执行我们定义的处理方法。
只需一步
创建全局异常类,类上添加 @ControllerAdvice注解(开启全局捕获的注解),在方法上添加 @ExceptionHandler() 标识异常类型注解 和 @ResponseBody 注解,之后通过参数获取到所有异常信息,格式自定义,返给前端。
一、下边以 处理所有校验失败的异常类
MethodArgumentNotValidException - 使用json请求体调用接口,校验异常抛出此异常类
为例
@ControllerAdvice
public class ControllerExceptionHandler {
/**
* 处理所有校验失败的异常 - MethodArgumentNotValidException异常
* @param e
* @return
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
@ResponseBody
public ComResponse ExceptionHandle(HttpServletRequest httpServletRequest, MethodArgumentNotValidException e) {
StringBuffer hp = httpServletRequest.getRequestURL();
String method = httpServletRequest.getMethod();
Map<String, Object> mapList = new HashMap<>();
SimpleDateFormat simp = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 获取到所有异常信息,put 到 mapList中去
List<String> errorList = e.getBindingResult()
.getFieldErrors()
.stream()
.map(m -> m.getDefaultMessage())
.collect(Collectors.toList());
mapList.put("error", errorList);
mapList.put("timestamp", simp.format(new Date()));
mapList.put("requestMethod", method + " " + hp);
ComResponse comResponse = new ComResponse<>();
comResponse.setData(mapList);
comResponse.setMsg("参数校验失败");
comResponse.setSuccess(false);
return comResponse;
}
}
测试,返给前端如下格式,error错误信息之所以是个数组,原因error信息有可能是多个,比如:id不能为空、name不能为空、··· ···
二、使用form data方式调用接口,校验失败抛出的异常类
BindException
三、单个参数校验失败抛出的异常类
ConstraintViolationException
四、处理空指针的异常处理
NullPointerException
/**
* 处理空指针的异常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value =NullPointerException.class)
@ResponseBody
public Result exceptionHandler(HttpServletRequest req, NullPointerException e){
System.err.println("未知异常!原因是:"+e);
return Result.error(CommonEnum.BODY_NOT_MATCH);
}
自定义注解编写:
https://hollis.blog.youkuaiyun.com/article/details/108687966