SpringBoot全局异常处理入门
在开发中,当我们需要构建一个基础的开发框架时,自定义错误页面、全局异常处理等技术点,是我们必须考虑的问题,那么如何在SpringBoot框架的基础上来优雅的解决这些问题呢?
springboot默认处理基本思路
关于错误页面的处理,SpringBoot提供了默认的支持,基本思路如下:
- 当页面请求发生异常时,会自动请求“/error”控制器;
- 此控制器会根据处理类型自动匹配,将处理类型为“text/html”的异常请求特殊处理,其他的异常请求默认处理。
- 特殊处理的方式为:根据响应码去查找对应的错误页面,例如,响应码为404,则系统会会在以下两个路径去查找页面:
如果两者都不存在,则系统会自动返回一个名称为“error”的视图,如果视图名称对应的模板页面(/templates/error.html)不存在,则系统会自动拼接一个错误页面响应给客户端,如下:模板路径:/templates/error/404.html 静态资源路径:/resources/META-INF/resources/error/404.html
- 默认处理方式为:除处理类型为“text/html”的请求外,其他异常请求,系统统一返回json格式数据,数据格式如下:
{ "timestamp": "2020-03-06T05:01:50.054+0000", "status": 404, "error": "Not Found", "message": "No message available", "path": "/x/x" }
自定义异常请求的方式
通过以上对SpringBoot异常请求的默认处理分析,可知,要想自定义异常请求的处理,大致有两种方式:
- 依赖默认处理方式,只自定义错误页面内容,这种方式最简单,缺点是不够灵活。
- 自定义异常请求控制器,将所有的异常请求转发至此控制器处理,这种方式比较灵活,也最常用
方式一:自定义错误页面
如果你想只定义一个错误页面,只需在templates目录下定义一个error.html即可,所有的异常请求将会自动跳转至此页面。
如果你想根据状态码不同跳转到不同的错误页面,只需在templates/error目录下,根据状态码定义错误页面,例如:
如果是404错误就会显示404.html,以此类推,除了写需要的html页面不需要其他额外的java代码
/error/404.html
/error/400.html
/error/500.html
方式二:自定义异常控制器
自定义异常控制器,是最为灵活的控制错误页面的方式
需要覆写 ErrorController 接口的 getErrorPath() 方法
代码如下:
@Controller
public class MyError implements ErrorController {
//默认请求地址
private static final String ERROR_PATH = "/error";
/**
* web页面异常请求处理
* @param request
* @return
*/
@RequestMapping(value = ERROR_PATH, produces = "text/html")
public ModelAndView errorHtml(HttpServletRequest request) {
HttpStatus statusCode = getStatus(request);
if (HttpStatus.BAD_REQUEST == status) {
return new ModelAndView("error/400");
} else if (HttpStatus.NOT_FOUND == status) {
return new ModelAndView("error/404");
} else {
return new ModelAndView("error/500");
}
}
/**
* 获取状态码
* @param request
* @return
*/
public Integer getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode != null) {
try {
return HttpStatus.valueOf(statusCode); //其他状态码
} catch (Exception ex) {
}
}
return HttpStatus.INTERNAL_SERVER_ERROR; //500
}
/**
* Spring 默认错误页路径
* @return
*/
@Override
public String getErrorPath() {
return ERROR_PATH;
}
}
以上异常控制器,将请求状态返回码为403、404、500的请求分别指向了与之对应的错误页面,将无法预知的状态码默认指向404的错误页,当然这个可以根据自己的业务情况而定