Spring Boot全局统一异常处理

本文最后更新于:2018年11月20日 晚上

前言

之前用 Spring Boot 写 RESTful API 的时候,对于各种错误的捕捉都是直接用 try catch 的,所以在各个方法里面都总是有一些相同的 try catch 代码块,虽然也是能用但是总有点别扭不自在。这两天学习了一下 Spring Boot 当中对于异常的统一处理,发现很简单但是却能让代码优雅不少。

定义自定义异常

不多累述

1
2
3
4
5
6
7
8
9
public class JsonParseException extends Exception {

private static final long serialVersionUID = 2008642168824905631L;

public JsonParseException(String msg){
super(msg);
}

}

定义对该异常的处理

我们可以把对异常的处理全部写在一个 GolbalExpectionHandleConfig 类当中, 具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@ControllerAdvice
public class GolbalExpectionHandleConfig {
@ExceptionHandler(value = JsonParseException.class)
@ResponseBody
public ResJson jsonParseErrorHandle(HttpServletRequest req, JsonParseException jse){
return ResJson.errorRequestParam(jse.getMessage()+" --> "+req.getRequestURL());
}

@ExceptionHandler(value = IOException.class)
@ResponseBody
public ResJson iOExceptionHandle(HttpServletRequest req, IOException ioe){
ioe.printStackTrace();
return ResJson.serverErrorJson("系统发生错误,IOExpection ,详情请查看服务器日志 --> "+req.getRequestURL());
}

@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResJson exceptionHandle(HttpServletRequest req, Exception e){
e.printStackTrace();
return ResJson.serverErrorJson("系统发生错误,Expection ,详情请查看服务器日志 --> "+req.getRequestURL());
}
}

Spring MVC重要注解 这里了解到以下几点

  • @ControllerAdvice 是一个 @Component ,用于定义@ExceptionHandler@InitBinder@ModelAttribute方法,使这些配置适用于所有使用@RequestMapping方法。
  • Spring4之前,@ControllerAdvice在同一调度的Servlet中协助所有控制器。Spring4 已经改变:@ControllerAdvice 支持配置控制器的子集,而默认的行为仍然可以利用。
  • 在Spring4中, @ControllerAdvice 通过 annotations()basePackageClasses()basePackages()方法定制用于选择控制器子集。

然后实际上除了 @ControllerAdvice 还有 @RestControllerAdvice,两者的区别估计是和@Controller@RestController 差不多吧

之后所有的 RequestMapping 方法如果抛出了异常的话就会被处理了