请求方式时,若不存在

  浏览器出现White label Error Page 错误页面

  其他客户端出现响应一个JSON格式文本包含错误码等信息

浏览器发送请求的请求头:

客户端请求头

这样就能区分来自哪..

原理:ErrorMvcAutoconfiguration 处理错误的自动配置

里面添加了以下组件

  1. DefaultErrorAttributes
  1. 帮我们在页面共享信息;
  2. @Override
  3. public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,
  4. boolean includeStackTrace) {
  5. Map<String, Object> errorAttributes = new LinkedHashMap<String, Object>();
  6. errorAttributes.put("timestamp", new Date());
  7. addStatus(errorAttributes, requestAttributes);
  8. addErrorDetails(errorAttributes, requestAttributes, includeStackTrace);
  9. addPath(errorAttributes, requestAttributes);
  10. return errorAttributes;
  11. }
  1. BasicErrorController 处理/error请求
  1. @Controller
  2. @RequestMapping("${server.error.path:${error.path:/error}}")
  3. public class BasicErrorController extends AbstractErrorController {
  4.  
  5. @RequestMapping(produces = "text/html")//产生html类型的数据;浏览器发送的请求来到这个方法处理
  6. public ModelAndView errorHtml(HttpServletRequest request,
  7. HttpServletResponse response) {
  8. HttpStatus status = getStatus(request);
  9. Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
  10. request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
  11. response.setStatus(status.value());
  12.  
  13. //去哪个页面作为错误页面;包含页面地址和页面内容
  14. ModelAndView modelAndView = resolveErrorView(request, response, status, model);
  15. return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
  16. }
  17.  
  18. @RequestMapping
  19. @ResponseBody //产生json数据,其他客户端来到这个方法处理;
  20. public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
  21. Map<String, Object> body = getErrorAttributes(request,
  22. isIncludeStackTrace(request, MediaType.ALL));
  23. HttpStatus status = getStatus(request);
  24. return new ResponseEntity<Map<String, Object>>(body, status);
  25. }
  1. ErrorPageCustomizer (系统出现错误4xx,5xx等错误)来到/error请求
  1. @Value("${error.path:/error}")
  2. private String path = "/error"; 系统出现错误以后来到error请求进行处理;(web.xml注册的错误页面规则)
  1. DefaultErrorViewResolver
  1. @Override
  2. public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,
  3. Map<String, Object> model) {
  4. ModelAndView modelAndView = resolve(String.valueOf(status), model);
  5. if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
  6. modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
  7. }
  8. return modelAndView;
  9. }
  10.  
  11. private ModelAndView resolve(String viewName, Map<String, Object> model) {
  12. //默认SpringBoot可以去找到一个页面? error/404
  13. String errorViewName = "error/" + viewName;
  14.  
  15. //模板引擎可以解析这个页面地址就用模板引擎解析
  16. TemplateAvailabilityProvider provider = this.templateAvailabilityProviders
  17. .getProvider(errorViewName, this.applicationContext);
  18. if (provider != null) {
  19. //模板引擎可用的情况下返回到errorViewName指定的视图地址
  20. return new ModelAndView(errorViewName, model);
  21. }
  22. //模板引擎不可用,就在静态资源文件夹下找errorViewName对应的页面 error/404.html
  23. return resolveResource(errorViewName, model);
  24. }

步骤:

​ 一但系统出现4xx或者5xx之类的错误;ErrorPageCustomizer就会生效(定制错误的响应规则);就会来到/error请求;就会被BasicErrorController处理;

​ 1)响应页面;去哪个页面是由DefaultErrorViewResolver解析得到的;

  1. protected ModelAndView resolveErrorView(HttpServletRequest request,
  2. HttpServletResponse response, HttpStatus status, Map<String, Object> model) {
  3. //所有的ErrorViewResolver得到ModelAndView
  4. for (ErrorViewResolver resolver : this.errorViewResolvers) {
  5. ModelAndView modelAndView = resolver.resolveErrorView(request, status, model);
  6. if (modelAndView != null) {
  7. return modelAndView;
  8. }
  9. }
  10. return null;
  11. }

Spring boot 错误处理机制的更多相关文章

  1. spring boot错误: 找不到或无法加载主类

    一:当在eclipse启动spring boot项目时出现问题: springboot错误: 找不到或无法加载主类 解决办法: 1,通过cmd命令行,进入项目目录进行,mvn clean instal ...

  2. Spring Boot的Listener机制的用法和实现原理详解

    之前在介绍了在spring-boot启动过程中调用runner的原理,今天我们介绍另外一种可以实现相似功能的机制:spring-boot的Listener机制. 通过注册Listener,可以实现对于 ...

  3. 16. Spring boot 错误页面

      默认效果:1).浏览器,返回一个默认的错误页面 1.1 请求头 1.2返回结果 2).如果是其他客户端,默认响应一个json数据 2.1请求头 2.2返回结果 { "timestamp& ...

  4. Spring Boot错误——SpringBoot 2.0 报错: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

    背景 使用Spring Cloud搭建微服务,服务的注册与发现(Eureka)项目启动时报错,错误如下 *************************** APPLICATION FAILED T ...

  5. 深度剖析Spring Boot自动装配机制实现原理

    在前面的分析中,Spring Framework一直在致力于解决一个问题,就是如何让bean的管理变得更简单,如何让开发者尽可能的少关注一些基础化的bean的配置,从而实现自动装配.所以,所谓的自动装 ...

  6. spring boot 错误处理总结

    在boot 中, 对404  和 异常 有了额外的处理. 当然,我们可以定制, 如何做呢? 1 写一个继承 ErrorController 的Controller 注意, 这里一定要继承 ErrorC ...

  7. spring boot 错误处理之深度历险

    今天终于把 boot 的异常处理完全研究透了: boot提供了很多错误的处理工作.默认情况下,我们会看到一个whiteLabel(白标)的页面. 这个可能不是我们所需.因此我们需要定制.我于是做了个深 ...

  8. spring boot 错误,求大神帮解决

    Exception in thread "main" java.lang.IllegalStateException: Failed to read Class-Path attr ...

  9. Spring boot错误处理以及定制错误页面

    如果是浏览器访问,返回错误页面 注意浏览器发送请求的请求头:  注意区别其他客户端哦比如 postman 如果是其他客户端,返回一个Json数据 原理可以参照ErrorMvcAutoConfigura ...

随机推荐

  1. consul-template + nginx部署高可用负载均衡

    一.Consul-Template简介 Consul-Template是基于Consul的自动替换配置文件的应用.在Consul-Template没出现之前,大家构建服务发现系统大多采用的是Zooke ...

  2. NodeJs使用async让代码按顺序串行执行

    描述 由于nodejs中的函数调用都是异步执行的,而笔者在工程开发中函数A需要四五个参数,而这四五个参数值都是通过函数调用获得,因此按顺序写代码时,执行到函数A时,往往函数A需要的参数值因为参数的异步 ...

  3. 学习笔记之TensorFlow

    TensorFlow https://www.tensorflow.org/ An open source machine learning framework for everyone Tensor ...

  4. MFC 控件使用教程

    combo box控件用法: 下拉选择控件,首先将控件拖动到你需要使用控件的地方,用ClassWizard为它关联一个变量,我们注意到变量类型是CString型的.右击属性,General中可以设置一 ...

  5. PHP中的static的理解

    静态方法 (1)静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性: (2)从当前类(不是子类)中访问静态方法或属性,可以使用 self 关键字,self 指向当前类,就 ...

  6. rnn实现三位数加法的训练

    #!/usr/bin/env python # coding=utf-8 from keras.models import Sequential from keras.layers import Ac ...

  7. 搞定queryString

    querystring字面上的意思就是查询字符串,一般是对http请求所带的数据进行解析.querystring模块只提供4个方法: querystring.parse querystring.str ...

  8. SAS infile 导入txt示例

    概要说明: 以下代码包含的知识点: 1)ods 2)format picture 3)symputx ods pdf file="D:\fgroup\users\output\time.pd ...

  9. OpenJudge 兔子与樱花

    [题解] 求任意两点间的最短路径.此题数据量较小,用Floyd算法,时间复杂度为O(n^3). 参考https://blog.csdn.net/qq_34594236/article/details/ ...

  10. 通过 SSH 转发TCP连接数据

    设定 首先双方的/etc/ssh/sshd_config设定以下四项: AllowAgentForwarding yes AllowTcpForwarding yes GatewayPorts yes ...