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)不存在,则系统会自动拼接一个错误页面响应给客户端,如下:
    在这里插入图片描述
  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的错误页,当然这个可以根据自己的业务情况而定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值