1、错误处理

1.1、 默认规则

  • 默认情况下,Spring Boot提供/error处理所有错误的映射
  • 对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息,对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据

  • 要对其进行自定义,添加View解析为error
  • 要完全替换默认行为,可以实现 ErrorController 并注册该类型的Bean定义,或添加ErrorAttributes类型的组件以使用现有机制但替换其内容。
  • error/下的4xx,5xx页面会被自动解析;

1.2、 定制错误处理逻辑

  • 自定义错误页

    • error/404.html error/5xx.html; 有精确的错误状态码页面就匹配精确,没有就找 4xx.html;如果都没有就触发白页
  • @ControllerAdvice+@ExceptionHandler处理全局异常;底层是 ExceptionHandlerExceptionResolver 支持的

  • @ResponseStatus+自定义异常 ;底层是 ponseStatusExceptionResolver ,把responsestatus注解的信息底层调用 response.sendError(statusCode, resolvedReason);tomcat发送的/error

  • pring底层的异常,如 参数类型转换异常;DefaultHandlerExceptionResolver 处理框架底层的异常。

    • response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());

    • 自定义实现 HandlerExceptionResolver 处理异常;可以作为默认的全局异常处理规则
  • ErrorViewResolver 实现自定义处理异常

    • response.sendError ,error请求会转给controller
    • 异常没有任何人能处理,tomcat底层 response.sendError,error请求就会转给controller
    • basicErrorController 要去的页面地址是 ErrorViewResolver

1.3、 异常处理自动配置原理

  • ErrorMvcAutoConfiguration 自动配置异常处理规则

  • 容器中的组件:类型:DefaultErrorAttributes -> id:errorAttributes

    • public class DefaultErrorAttributes implements ErrorAttributes, HandlerExceptionResolver

    • **DefaultErrorAttributes:**定义错误页面中可以包含哪些数据。

  • 容器中的组件:类型:BasicErrorController --> id:basicErrorController(json+白页 适配响应)

    • 处理默认 /error 路径的请求;页面响应 new ModelAndView(“error”, model);
    • 容器中有组件 View->id是error(响应默认错误页)
    • 容器中放组件 BeanNameViewResolver(视图解析器)按照返回的视图名作为组件的id去容器中找View对象
  • 容器中的组件:类型:DefaultErrorViewResolver -> id:conventionErrorViewResolver

    • 如果发生错误,会以HTTP的状态码 作为视图页地址(viewName),找到真正的页面
    • error/404、5xx.html

如果想要返回页面;就会找error视图(StaticView), (默认是一个白页)

1.4、 异常处理步骤流程

  • 执行目标方法,目标方法运行期间有任何异常都会被catch、而且标志当前请求结束;并且用 dispatchException
  • 进入视图解析流程(页面渲染)
    processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)
  • mv = processHandlerException->处理handler发生的异常,处理完成返回ModelAndView
  1. 遍历所有的 handlerExceptionResolvers,看谁处理当前异常(HandlerExceptionResolver处理器异常解析器)
  2. 系统默认的 异常解析器
  • DefaultErrorAttributes先来处理异常。把异常信息保存到rrequest域,并且返回null

  • 默认不能处理异常,所以异常会被抛出

    • 如果没有任何人能处理最终底层就会发送 /error 请求。会被底层的BasicErrorController处理
    • 解析错误视图,遍历所有的 ErrorViewResolver 看谁能解析。
    • 默认的 DefaultErrorViewResolver ,作用是把响应状态码作为错误页的地址,error/500.html
    • 模板引擎最终响应这个页面 error/500.html

SpringBoot-异常处理相关推荐

  1. SpringBoot异常处理的简单理解

    Springboot异常处理: 1.局部异常处理: 直接对Controller类进行操作 2.全局统一异常处理 Springboot两种全局异常统一处理的方式: A.使用继承BasicErrorCon ...

  2. SpringBoot异常处理ErrorController详解

    文章目录 一.背景 二.SpringBoot的默认异常处理BasicErrorController 三.自定义错误异常 写在前面: 我是「境里婆娑」.我还是从前那个少年,没有一丝丝改变,时间只不过是考 ...

  3. SpringBoot异常处理以及对数据正确性的检查

    SpringBoot异常处理以及对数据正确性的检查 一个项目中的异常处理是非常沉重的话题,每次做项目中如果异常处理的不好,轻微一点的会让测试人员找到你的问题,严重点的会把报错的日志打印给客户展示,这可 ...

  4. springboot异常处理方式

    springboot异常处理方式 参考文章: (1)springboot异常处理方式 (2)https://www.cnblogs.com/whalesea/p/11384397.html 备忘一下.

  5. Springboot异常处理errorController

    Springboot异常处理errorController 参考文章: (1)Springboot异常处理errorController (2)https://www.cnblogs.com/jiah ...

  6. SpringBoot异常处理

    文章目录 springboot处理异常的5种方式 1.自定义错误页面 2.@ExceptionHandle 注解处理异常 3.@ControllerAdvice+@ExceptionHandler 注 ...

  7. 【springboot异常处理】用异常信息枚举类处理异常,使用自定义异常封装异常对象,返回统一异常处理结果

    1.目录: 异常信息枚举类 自定义异常类 自定义响应数据 全局异常处理类 测试 总结 异常信息枚举类 由于在业务中,有很多异常,针对不同的业务,可能给出的提示信息不同,所以为了方便项目异常信息管理,我 ...

  8. SpringBoot异常处理-自定义HandlerExceptionResolver

    需要再全局异常处理类中实现HandlerExceptionResolver 接口 package com.learn.exception;import javax.servlet.http.HttpS ...

  9. SpringBoot异常处理-SimpleMappingExceptionResolver

    在全局异常类中添加一个方法完成异常的同一处理 package com.learn.exception;import java.util.Properties;import org.springfram ...

  10. SpringBoot异常处理-@ControlleAdvice

    @ControllerAdvice+@ExceptionHandler 注解处理异常 需要创建一个能够处理异常的全局异常类.在该类上需要添加@ControllerAdvice 注解 package c ...

最新文章

  1. 公共交通伸展城市智慧
  2. gsonformat插件_收藏非常有用的IDEA插件,没用过这些IDEA插件?怪不得写代码头疼
  3. mysql抖动可能的原因,12 | 为什么我的MySQL会“抖”一下?
  4. nginx第三方模块---nginx-sticky-module的使用(基于cookie的会话保持)
  5. C++ Regsvr32订购具体解释
  6. 知道ip地址如何进入电脑_如何防止局域网电脑IP地址冲突
  7. Windows不需要输密码,直接登录显示桌面
  8. 12、阈值分割基础理论
  9. 最新Erphpdown v13.11modown8.02主题破jie版去授权无域名限制版本
  10. 操作系统-信号量机制的一些习题
  11. Flutter跑马灯Marquee
  12. 免费听歌下载歌曲的几个网站
  13. NOJ1060接苹果——DP
  14. java 逃逸分析_JVM之逃逸分析
  15. mysql启动失败LSB_mysql启动报错:Failed to start LSB: start and stop MySQL
  16. java使用poi实现excel保护工作表实例代码(支持.xls和.xlsx)
  17. C# SolidWorks 二次开发 API --- 提升exe执行效率接近DLL
  18. 前端面试题-小米二面
  19. 线性判别函数:感知器、松弛算法、Ho-Kashyap算法
  20. [还不会搭建博客吗?]centos7系统部署hexo博客新手入门-进阶,看这一篇就够了

热门文章

  1. dj鲜生-28-登陆验证父类的使用-Mixin类的定义
  2. django-shell操作模型类
  3. 索引-python编程技术-第二版
  4. C#多线程操作界面控件的解决方案
  5. 2015 年出现的十大流行 Python 库
  6. Differential Geometry之第九章常平均曲率曲面
  7. 蓝牙4.0大数据分包处理
  8. OAuth和OpenID的区别(转)
  9. Matlab norm 用法小记
  10. Ajax表格控件实现