深入Spring Boot (九):Web应用统一异常处理

默认情况下,Spring Boot为基于SpringMVC的Web应用提供了全局统一异常处理,本篇将深入介绍默认的统一异常处理及自定义异常处理,主要包含以下4部分内容:

  1. 默认异常处理;

  2. 覆盖默认异常处理;

  3. 自定义异常处理;

  4. 自定义异常页面。

默认异常处理

通过浏览器请求一个不存在的页面或服务端处理发生异常时,Spring Boot会返回类似如下的错误提示页面: 

640?wx_fmt=png

当使用Postman等调试工具发送请求请求一个不存在的url或服务端处理发生异常时,Spring Boot会返回类似如下的Json格式字符串信息:

{

    "timestamp": "2018-03-12T06:11:45.209+0000",

    "status": 404,

    "error": "Not Found",

    "message": "No message available",

    "path": "/index.html"

通过断点调试可以发现,当请求一个不存在的url或服务端处理发生异常时,Spring Boot捕获到这个异常后会请求/error,这个/error请求会在BasicErrorController中处理,这个类里面有两个重要处理方法errorHtml和error。默认情况下浏览器发送的请求头中Accept为text/html,所以此时请求进入errorHtml方法处理,Spring Boot会响应一个“Whitelabel Error Page”页面;当使用Postman等调试工具发送请求时,默认情况下请求头中没有Accept信息,所以请求进入error方法处理,Spring Boot会返回一个Json格式的错误信息字符串,具体代码如下图所示。

640?wx_fmt=png

覆盖默认异常处理

虽然Spring Boot提供了默认全局统一异常处理机制,但在真实的应用中,这样的错误提示并不友好,所以,需要修改这种默认处理机制。查看BasicErrorController的类结构,发现它继承自AbstractErrorController,而AbstractErrorController实现了ErrorController接口,所以,如果想覆盖默认异常处理机制,可以自定义类实现ErrorController接口,并将自定义类注册为bean,这种方法将完全替换原来的处理机制。

如果还想继续使用BasicErrorController中的异常处理机制,只是想新增一些其它处理机制,例如添加对application/json媒体类型的异常处理,只需要自定义一个类并继承BasicErrorController,同时在自定义类中新增对application/json媒体类型的异常处理方法即可。

自定义异常处理

Spring Boot仍然支持SpringMVC原有的异常处理机制,可以用@ControllerAdvice注解和@ExceptionHandler注解实现对指定异常的特殊处理,例如如下代码:

@ControllerAdvice

public class MyExceptionHandler {

    //只处理ArgumentException异常,返回名称为exception的页面,

    //例如使用freemarker并且模板文件后缀为.html,最终页面显示的是exception.html

    @ExceptionHandler(value = ArgumentException.class)

    public String handleException(Model model, HttpServletRequest request, Exception ex) {

        //省略具体异常处理代码

        model.addAttribute("msg", ex.getMessage());

        return "exception";

    }

    //只处理MyException异常,返回JSON格式数据,数据元素是Response类属性

    @ExceptionHandler(value = MyException.class)

    @ResponseBody

    public Response handleMyException(Model model, HttpServletRequest request, Exception ex) {

        //省略具体异常处理代码

        Response response = new Response();

        response.setCode("123456");

        response.setMsg("错误信息");

        return response;

    }

}

自定义异常页面

如果想为指定的状态码显示一个自定义的错误页面,可以将这个自定义的错误页面添加到/error目录下。错误页面可以是静态HTML,也可以是使用模板构建的文件,例如freemarker,文件的名称必须是确切的状态码。例如使用freemarker模板引擎,并且模板后缀名为.html,可以有如下自定义错误页面。 

640?wx_fmt=png

当请求一个不存在资源的url时状态码为404,此时显示404.html页面;当服务端处理发生异常时状态码为500,此时显示500.html页面。

END 

如果觉得有收获,记得关注、点赞、转发。

640?wx_fmt=png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值