zoukankan      html  css  js  c++  java
  • springboot 异常处理机制源码分析

    在接收一个异常后, springboot会发送请求到默认的 BasicErrorController

    这是里面默认的两个映射

    第一个用于接收请求中accept包含 text/html的请求, 第二个用于接收没有text/html的请求

    然后通过java.servlet.error.status_code这个key获取到对应的错误状态码, 这里看到attributes对应的是一个ConcurrentHashMap<>()

    通过getstatus()中的Httpstatus.valueof()将对应的值转为HttpStatus枚举类

    所以用于捕捉异常的方法不能设置为枚举类, 就会发出java.lang.ClassCastException: org.springframework.http.HttpStatus cannot be cast to java.lang.Integer

    但是可以设置为如下格式, 或者直接给出对应的值

    然后再通过getErrorAttributes 获取到错误信息

    这里可以看到, 放入了什么信息, 有日期, 状态码, 异常的信息,根据请求域的不同获取请求的servletPath

    将这些信息放入Map<String, Object> model

    然后通过resolverErrorView解析视图, 可以看到调用了resolve方法

    这里可以清楚的看到通过thymeleaf模板跳转到了 error/viewName, 也就是templates/error/viewName.html

    然后将map和view一起返回

    getProvider()会检查视图是不是在templates文件下, 如果不在就访问静态资源下的 static/error/viewName.html ,如果静态资源下没有, 就返回null

    接下来就是一种特殊情况, templates和静态资源路径下找不到对应的视图, 就会进入resolve()

    调用get方法

    一路追踪

    发现org.springframework.http.HttpStatus$Series是一个枚举类

    在通过算法, 得出statutsCode = 400 可以对应 4xx的viewName , 同理 5xx

    如果 4xx 和 5xx 也没有

    就通过return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);

    来判断 ,如果modelAndView就带着model跳转到内置的Whitelabel Error Page(这里并不是很清楚, 具体的实现)


    这里用postman 模拟一下另一个映射

    会返回json数据类型的到前台

    thymeleaf可以通过ModelAndView返回的model拿到值

  • 相关阅读:
    使用Xshell和Xftp部署简单的项目
    1-27 sed基本编程和cut基本应用
    1-26-1-expect无交互式-正则表达式
    1-24-case流程控制和while循环语句的使用
    1-23-shell脚本之-if流程控制语句和for循环语句的使用
    1-22-shell脚本基本应用-实验手册
    1-22-shell脚本的基础
    1-21 网络管理相关的命令
    总结 1-1 ~ 1-6
    windows系统下Eclipse启动界面更改
  • 原文地址:https://www.cnblogs.com/kikochz/p/12813153.html
Copyright © 2011-2022 走看看