导语 在Spring Boot开发过程中,不难避免的就是异常处理,有些异常是通过try catch方式捕获,或者是通过Throw直接抛出,但是这种方式的话对于客户端是不友好的,所以希望是通过编码的方式将这些异常进行正确的客户端显示,这样就可以提升代码可读性,提升用户体验。博主做过一个项目代码中的异常处理就是特别不友好的,面对这种状态,就需要一个全局的异常处理。下面就来看看Spring Boot提供的全局异常处理机制
在Spring Boot中提供了两个用于做全局异常处理的注解
@ControllerAdvice :用来开启全局的异常捕获@ExceptionHandler : 用来说明捕获那些异常,并且对那些异常进行处理首先来创建一个异常处理的类,也就是说在运行时出现任何的异常都会被这个地方处理
@ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(value = Exception.class) public String exceptionHandler(Exception e){ System.out.println(e) return e.getMessage(); } }编写一个Controller,构造一个最简单的异常,来查看最后的结果
@RestController public class TestController { @GetMapping("/test") public String exception(){ int a = 0; int b = 10; int i = b / a; System.out.println(i); return "hello"; } }返回结果
发生一个异常java.lang.ArithmeticException: / by zero但是这种处理机制,对于现在比较流行的前后端分离的项目,并不是太友好了,这种结果不能准确的被前端项目所使用。所以需要定义一个统一的返回结果,这样的话对前端的小伙伴来说就比较好了。
封装一个统一的Result类,如下
public class Result<T> { private Integer code; private String message; private T data; public Result(Integer code, String message, T data) { this.code = code; this.message = message; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } }首先这里有一个需要注意的地方,在Spring Boot中默认提供了一种JSON转化的方式。所以在使用异常的时候多出来另外一个注解
@RestControllerAdvice :基于RESTFul风格的异常处理结果返回。所以将上面的配置类转化为如下
@RestControllerAdvice //@ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(value = SelfException.class) public Result<String> exceptionHandler(SelfException e){ Result result = new Result(500,"服务器内部异常",e.getMessage()); return result; } }自定义异常实现
@RestController public class TestController { @GetMapping("/get") public String exception(){ int i = 0; if (i==0){ throw new SelfException("请求的参数是否是幂等"); } i++; return "hello"; } }返回结果
{ "code": 500, "message": "服务器内部异常", "data": "请求的参数是否是幂等" }在默认情况下,Spring Boot 不会抛出404的异常,所以在正常访问的时候并没有在控制台看到404的异常。可以通过配置文件来改变这个配置。
spring: mvc: throw-exception-if-no-handler-found: true # 当发现404 异常的时候进行抛出 resources: add-mappings: false # 关闭默认资源链接 Resolved [org.springframework.web.servlet.NoHandlerFoundException: No handler found for GET /test]在基础部分的时候我们了解过在resource目录下面创建error的目录,Spring Boot会自动进行映射。当然,也可以通过上面异常捕获的方式来进行处理将页面的错误请求进行处理。但是这里需要注意,这个操作要基于ErrorController来修改,当然这种方式已经不被推荐了。
public class Error404Handler implements ErrorController { @Override public String getErrorPath() { return null; } }通过以下的三个注解来实现全局异常处理,当然还可以通过扩展方式来实现自定义的内容。
@RestControllerAdvice@ControllerAdvice@ExceptionHandler