spring-boot中可以通过使用ControllerAdvice或RestControllerAdvice注解结合ExceptionHandler注解实现统一异常处理,由于spring-boot启动时会自动扫描并注入,因此使用起来非常方便,下面介绍基本的实现方式。
1. 新建统一异常处理类
其实统一异常处理本质上是采用ControllerAdvice注解定义一个切面,通过类似Controller的方式来返回异常结果。首先我们可以新建一个处理类CommonExceptionHandler。
CommonExceptionHandler.java
//在类上使用RestControllerAdvice注解,表示返回的是一个body,可以把这个类看作一个controller
//这里也可以使用ControllerAdvice注解,这时需要在下面的方法中添加ResponseBody的注解
@RestControllerAdvice
@Slf4j
public class CommonExceptionHandler {
}
2. 配置具体的异常处理方法
之后我们可以在这个类中使用ExceptionHandler注解配置异常处理,类似与controller中的action,当系统抛出特定异常时,这里的方法会按照配置执行。
CommonExceptionHandler.java
@RestControllerAdvice
@Slf4j
public class CommonExceptionHandler {
//注解中的value可以指定捕获的异常类型,可以支持多个异常
@ExceptionHandler(value = {AuthException.class, AuthenticationException.class}) //缺少权限
public Result handle(AuthException e) {
log.error(e.getMessage());//输出日志
return ResultUtil.error(401, e.getMessage());//返回结果
}
@ExceptionHandler(value = Exception.class) //内部错误
public Result handle(Exception e) {
log.error(e.getMessage());
return ResultUtil.error(500, e.getMessage());
}
}
}
这里我采用了自定义的返回类型Result,可以根据自己的需求修改。
3. controller抛出异常
由于ControllerAdvice是从controller层捕获到异常,因此需要确保controller能抛出异常,这样才能使得异常被正确处理。
TestController.java
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String Test() throws Exception {//需要抛出异常
logger.error("Test log");
throw new Exception("Test log");
}
最后的输出结果:
{
"ErrorCode": 500,
"ErrorMessage": "Test log",
"Data": null,
"IsSuccess": false
}
网友评论