Spring boot 错误处理机制
请求方式时,若不存在
浏览器出现White label Error Page 错误页面
其他客户端出现响应一个JSON格式文本包含错误码等信息
浏览器发送请求的请求头:
客户端请求头
这样就能区分来自哪..
原理:ErrorMvcAutoconfiguration 处理错误的自动配置
里面添加了以下组件
- DefaultErrorAttributes
- 帮我们在页面共享信息;
- @Override
- public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,
- boolean includeStackTrace) {
- Map<String, Object> errorAttributes = new LinkedHashMap<String, Object>();
- errorAttributes.put("timestamp", new Date());
- addStatus(errorAttributes, requestAttributes);
- addErrorDetails(errorAttributes, requestAttributes, includeStackTrace);
- addPath(errorAttributes, requestAttributes);
- return errorAttributes;
- }
- BasicErrorController 处理/error请求
- @Controller
- @RequestMapping("${server.error.path:${error.path:/error}}")
- public class BasicErrorController extends AbstractErrorController {
- @RequestMapping(produces = "text/html")//产生html类型的数据;浏览器发送的请求来到这个方法处理
- public ModelAndView errorHtml(HttpServletRequest request,
- HttpServletResponse response) {
- HttpStatus status = getStatus(request);
- Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
- request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
- response.setStatus(status.value());
- //去哪个页面作为错误页面;包含页面地址和页面内容
- ModelAndView modelAndView = resolveErrorView(request, response, status, model);
- return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
- }
- @RequestMapping
- @ResponseBody //产生json数据,其他客户端来到这个方法处理;
- public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
- Map<String, Object> body = getErrorAttributes(request,
- isIncludeStackTrace(request, MediaType.ALL));
- HttpStatus status = getStatus(request);
- return new ResponseEntity<Map<String, Object>>(body, status);
- }
- ErrorPageCustomizer (系统出现错误4xx,5xx等错误)来到/error请求
- @Value("${error.path:/error}")
- private String path = "/error"; 系统出现错误以后来到error请求进行处理;(web.xml注册的错误页面规则)
- DefaultErrorViewResolver
- @Override
- public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,
- Map<String, Object> model) {
- ModelAndView modelAndView = resolve(String.valueOf(status), model);
- if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
- modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
- }
- return modelAndView;
- }
- private ModelAndView resolve(String viewName, Map<String, Object> model) {
- //默认SpringBoot可以去找到一个页面? error/404
- String errorViewName = "error/" + viewName;
- //模板引擎可以解析这个页面地址就用模板引擎解析
- TemplateAvailabilityProvider provider = this.templateAvailabilityProviders
- .getProvider(errorViewName, this.applicationContext);
- if (provider != null) {
- //模板引擎可用的情况下返回到errorViewName指定的视图地址
- return new ModelAndView(errorViewName, model);
- }
- //模板引擎不可用,就在静态资源文件夹下找errorViewName对应的页面 error/404.html
- return resolveResource(errorViewName, model);
- }
步骤:
一但系统出现4xx或者5xx之类的错误;ErrorPageCustomizer就会生效(定制错误的响应规则);就会来到/error请求;就会被BasicErrorController处理;
1)响应页面;去哪个页面是由DefaultErrorViewResolver解析得到的;
- protected ModelAndView resolveErrorView(HttpServletRequest request,
- HttpServletResponse response, HttpStatus status, Map<String, Object> model) {
- //所有的ErrorViewResolver得到ModelAndView
- for (ErrorViewResolver resolver : this.errorViewResolvers) {
- ModelAndView modelAndView = resolver.resolveErrorView(request, status, model);
- if (modelAndView != null) {
- return modelAndView;
- }
- }
- return null;
- }
Spring boot 错误处理机制的更多相关文章
- spring boot错误: 找不到或无法加载主类
一:当在eclipse启动spring boot项目时出现问题: springboot错误: 找不到或无法加载主类 解决办法: 1,通过cmd命令行,进入项目目录进行,mvn clean instal ...
- Spring Boot的Listener机制的用法和实现原理详解
之前在介绍了在spring-boot启动过程中调用runner的原理,今天我们介绍另外一种可以实现相似功能的机制:spring-boot的Listener机制. 通过注册Listener,可以实现对于 ...
- 16. Spring boot 错误页面
默认效果:1).浏览器,返回一个默认的错误页面 1.1 请求头 1.2返回结果 2).如果是其他客户端,默认响应一个json数据 2.1请求头 2.2返回结果 { "timestamp& ...
- 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 ...
- 深度剖析Spring Boot自动装配机制实现原理
在前面的分析中,Spring Framework一直在致力于解决一个问题,就是如何让bean的管理变得更简单,如何让开发者尽可能的少关注一些基础化的bean的配置,从而实现自动装配.所以,所谓的自动装 ...
- spring boot 错误处理总结
在boot 中, 对404 和 异常 有了额外的处理. 当然,我们可以定制, 如何做呢? 1 写一个继承 ErrorController 的Controller 注意, 这里一定要继承 ErrorC ...
- spring boot 错误处理之深度历险
今天终于把 boot 的异常处理完全研究透了: boot提供了很多错误的处理工作.默认情况下,我们会看到一个whiteLabel(白标)的页面. 这个可能不是我们所需.因此我们需要定制.我于是做了个深 ...
- spring boot 错误,求大神帮解决
Exception in thread "main" java.lang.IllegalStateException: Failed to read Class-Path attr ...
- Spring boot错误处理以及定制错误页面
如果是浏览器访问,返回错误页面 注意浏览器发送请求的请求头: 注意区别其他客户端哦比如 postman 如果是其他客户端,返回一个Json数据 原理可以参照ErrorMvcAutoConfigura ...
随机推荐
- consul-template + nginx部署高可用负载均衡
一.Consul-Template简介 Consul-Template是基于Consul的自动替换配置文件的应用.在Consul-Template没出现之前,大家构建服务发现系统大多采用的是Zooke ...
- NodeJs使用async让代码按顺序串行执行
描述 由于nodejs中的函数调用都是异步执行的,而笔者在工程开发中函数A需要四五个参数,而这四五个参数值都是通过函数调用获得,因此按顺序写代码时,执行到函数A时,往往函数A需要的参数值因为参数的异步 ...
- 学习笔记之TensorFlow
TensorFlow https://www.tensorflow.org/ An open source machine learning framework for everyone Tensor ...
- MFC 控件使用教程
combo box控件用法: 下拉选择控件,首先将控件拖动到你需要使用控件的地方,用ClassWizard为它关联一个变量,我们注意到变量类型是CString型的.右击属性,General中可以设置一 ...
- PHP中的static的理解
静态方法 (1)静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性: (2)从当前类(不是子类)中访问静态方法或属性,可以使用 self 关键字,self 指向当前类,就 ...
- rnn实现三位数加法的训练
#!/usr/bin/env python # coding=utf-8 from keras.models import Sequential from keras.layers import Ac ...
- 搞定queryString
querystring字面上的意思就是查询字符串,一般是对http请求所带的数据进行解析.querystring模块只提供4个方法: querystring.parse querystring.str ...
- SAS infile 导入txt示例
概要说明: 以下代码包含的知识点: 1)ods 2)format picture 3)symputx ods pdf file="D:\fgroup\users\output\time.pd ...
- OpenJudge 兔子与樱花
[题解] 求任意两点间的最短路径.此题数据量较小,用Floyd算法,时间复杂度为O(n^3). 参考https://blog.csdn.net/qq_34594236/article/details/ ...
- 通过 SSH 转发TCP连接数据
设定 首先双方的/etc/ssh/sshd_config设定以下四项: AllowAgentForwarding yes AllowTcpForwarding yes GatewayPorts yes ...