SpringBoot全局异常处理入门 左手的ㄟ右手 2022-12-27 01:21 170阅读 0赞 ### SpringBoot全局异常处理入门 ### * springboot默认处理基本思路 * 自定义异常请求的方式 * * 方式一:自定义错误页面 * 方式二:自定义异常控制器 在开发中,当我们需要构建一个基础的开发框架时,自定义错误页面、全局异常处理等技术点,是我们必须考虑的问题,那么如何在SpringBoot框架的基础上来优雅的解决这些问题呢? # springboot默认处理基本思路 # 关于错误页面的处理,SpringBoot提供了默认的支持,基本思路如下: 1. 当页面请求发生异常时,会自动请求“/error”控制器; 2. 此控制器会根据处理类型自动匹配,将处理类型为“text/html”的异常请求特殊处理,其他的异常请求默认处理。 3. 特殊处理的方式为:根据响应码去查找对应的错误页面,例如,响应码为404,则系统会会在以下两个路径去查找页面: 模板路径:/templates/error/404.html 静态资源路径:/resources/META-INF/resources/error/404.html 如果两者都不存在,则系统会自动返回一个名称为“error”的视图,如果视图名称对应的模板页面(/templates/error.html)不存在,则系统会自动拼接一个错误页面响应给客户端,如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDYyNDQxMA_size_16_color_FFFFFF_t_70] 4. 默认处理方式为:除处理类型为“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的错误页,当然这个可以根据自己的业务情况而定 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDYyNDQxMA_size_16_color_FFFFFF_t_70]: /images/20221120/3588ded2c7f7412c889a1a49fb7646e1.png
还没有评论,来说两句吧...