Loading

三、SpringBoot异常处理(SpringBoot系列)

自定义异常页面

  1. 直接在static/error目录下添加静态页面,文件名为状态码(500.html),不用再额外设置,会返回指定页面,也支持模糊匹配 (5xx.html)

  2. 使用thymeleaf生成动态页面,放在thymeleaf/error 目录下,同上,文件名设为状态名,遇到错误时,会直接跳转、

  3. 当静态异常页面和动态异常页面两个都储存在时,优先级

    thymeleaf精准匹配页面 > 静态精准匹配页面 > thymeleaf模糊匹配页面 > 静态模糊匹配页面

image-20210517213156122

自定义异常页面的原理

建议自己在ErrorMvcAutoConfiguration中跟一下源码

  1. 在ErrorMvcAutoConfiguration 类中静态内部类DefaultErrorViewResolverConfiguration中提供了DefaultErrorViewResolver

    image-20210517213640921

  2. DefaultErrorViewResolver中resolveErrorView()方法

    image-20210517215454583

    1. 从SpringBoot默认四个放置静态文件的目录中匹配

image-20210517214646083

自定义异常数据:

ErrorMvcAutoConfiguration类中提供了一个DefaultErrorAttributes处理异常数据,我们可以直接继承DefaultErrorAttributes,重写接口ErrorAttributes中getErrorAttrobutes()方法,基于DefaultErrorAttributes已经处理过的异常数据进行修改(若直接继承ErrorAttributes重写方法,还需要自己处理异常,比较麻烦):

image-20210517220602382

image-20210517221043463

实现:

@Component
public class MyErrorAttribute extends DefaultErrorAttributes {
    @Override
    public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
        Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
        map.put("myError", "自定义的异常信息!");
        return map;
    }
}

自定义异常视图:

异常处理视图和 自定义异常页面 默认都是DefaultErrorViewResolver处理的,若想自定义,也可继承DefaultErrorViewResolver,基于它的基础进行修改

image-20210517221613503

实现:

@Component
public class MyErrorViewResolver extends DefaultErrorViewResolver {
    public MyErrorViewResolver(ApplicationContext applicationContext, ResourceProperties resourceProperties) {
        super(applicationContext, resourceProperties);
    }
    
    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
        // model是异常数据,是不可修改map
        // 我们也可以直接在这里自定义异常数据,不过要新建一个map,在把值赋值过去
        ModelAndView mv = new ModelAndView();
        mv.setViewName("error");
        mv.addAllObjects(model);
        return mv;
    }
}
posted @ 2021-05-17 22:24  半瓶牛奶🥛  阅读(177)  评论(0编辑  收藏  举报