• 三、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;
        }
    }
    
  • 相关阅读:
    JS处理日期&字符串格式相互转换
    Ajax 原理过程 同步与异步区别 优缺点
    元素居中
    width:100%;与width:auto;的区别
    URL、URI和URN三者之间的区别
    JavaScript encodeURI(), decodeURI(), encodeURIComponent(), decodeURIComponent()
    CSS 笔记三(Tables/Box Model/Outline)
    CSS 笔记二(Text/Fonts/Links/Lists)
    CSS 笔记一(Selectors/ Backgrounds/ Borders/ Margins/ Padding/ Height and Width)
    javascript,jQuery,trim()
  • 原文地址:https://www.cnblogs.com/zhaoyuan72/p/14778915.html
Copyright © 2020-2023  润新知