目录

Spring boot 错误处理机制概述

Spring boot 错误处理机制原理

Spring boot 定制错误页面跳转


Spring boot 错误处理机制概述

1、Spring Boot web 应用,当浏览器访问发生错误时,默认会显然如下的错误页面,包含 时间戳、错误类型、状态码、以及错误消息等

2、显然实际开发中需要自己接手管理错误处理,定制错误页面提升用户体验。

3、当第三方的 APP 应用访问 web 应用的接口时,如果发生错误,则显然无法让它跳转到错误页面,而需要将错误参数返回。因为 app 的数据也通常是通过调用服务器接口来获取的,当发生错误时,直接返回错误数据即可,如:

{
    " timestamp": 1519637719324,
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/crud/aaa"
}

4、Spring Boot 会根据请求头信息中的 " Accept " 字段字段进行判断,发生错误时,如果是浏览器访问,则跳转到错误页面,如果是 app 内部访问,则直接返回错误数据。

Spring boot 错误处理机制原理

1、Spring Boot 关于错误处理的自动配置可以参照 “ ErrorMvcAutoConfiguration ” 类

package org.springframework.boot.autoconfigure.web.servlet.error;
.......
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })
// Load before the main WebMvcAutoConfiguration so that the error View is available
@AutoConfigureBefore(WebMvcAutoConfiguration.class)
@EnableConfigurationProperties({ ServerProperties.class, ResourceProperties.class })
public class ErrorMvcAutoConfiguration {
........
ErrorMvcAutoConfiguration ” 中给容器添加了以下几个关键组件
DefaultErrorAttributes

用于提供默认的错误属性,从而可以在页面获取这些信息并显示,如 <h1>status:[[${status}]]</h1>

timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里

BasicErrorController 处理默认的 /error 请求
DefaultErrorViewResolver 默认的错误视图解析器,即发生错误,应用应该去哪里找错误页面

2、BasicErrorController 处理默认的 /error 请求,源码如下:

@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {private final ErrorProperties errorProperties;
//.......//产生 html 类型的数据:浏览器发送的请求如果发生错误时,就来到这个方法进行处理@RequestMapping(produces = "text/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 ? modelAndView : new ModelAndView("error", model));}//产生 json 类型的数据:如 APP 等客户端请求发生错误时,来到这个方法进行处理@RequestMapping@ResponseBodypublic ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {Map<String, Object> body = getErrorAttributes(request,isIncludeStackTrace(request, MediaType.ALL));HttpStatus status = getStatus(request);return new ResponseEntity<>(body, status);}
//.......
}

3、DefaultErrorViewResolver 默认的错误视图解析器,浏览器访问发生错误时,跳转到哪个错误页面,源码:

public class DefaultErrorViewResolver implements ErrorViewResolver, Ordered {
//......private static final Map<Series, String> SERIES_VIEWS;static {Map<Series, String> views = new EnumMap<>(Series.class);views.put(Series.CLIENT_ERROR, "4xx");views.put(Series.SERVER_ERROR, "5xx");SERIES_VIEWS = Collections.unmodifiableMap(views);}@Overridepublic 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) {// 默认 Spring Boot 会去到 error 目录下寻找,如:error/404.htmlString errorViewName = "error/" + viewName;//如果 error 目录位于模板引擎(templates)目录下,则使用模板引擎解析视图TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName, this.applicationContext);if (provider != null) {//模板引擎可用的情况下返回到 errorViewName 指定的视图地址return new ModelAndView(errorViewName, model);}//模板引擎不可用时,就去静态资源文件夹下找 errorViewName 对应的页面 如:error/404.htmlreturn resolveResource(errorViewName, model);}
//......
}

Spring boot 定制错误页面跳转

1、通过上面的错误处理机制原理可知,错误页面默认需要放在类路径下的 "error " 目录下,错误页面使用 http 错误代码进行命名,如 404.html、500.html 等。

2、也可以使用 4xx、5xx 作为错误页面的泛指文件名,例如当同时存在 404.html 与 4xx.html 文件,访问发生 404 错误时,优先匹配进入 404.html 页面,而发生 404 以外的错误时,则进入了 4xx.html 页面。

3、约定的 error 目录可以放在模板引擎目录(templates)下,也可以放在 4 大静态资源目录下,推荐放在 template 下,因为模板引擎下,可以使用 thymeleaf 模板引擎,静态文件夹下无法使用 Thymeleaf 模板引擎。

错误页面源码:https://github.com/wangmaoxiong/thymeleafapp/tree/master/src/main/resources/templates/error

4、如果将错误页面放在四大静态资源目录下,则跳转是没问题的,只是页面中无法再使用 thymelaf 模板引擎语法,只能自己写页面内容,无法获取后台具体的信息值,如状态码、错误信息等。

Spring boot 2.x 错误处理机制 与 定制错误页面相关推荐

  1. Spring Boot错误处理机制以及定制自己的错误页面

    在我们使用Spring Boot的过程中肯定有遇到过发生错误的时候,这个时候可能页面上出现的就是Spring Boot默认的错误界面,有的时候我们希望能显示我们自己设置的错误界面,或者携带我们自己的错 ...

  2. Spring Boot 集成 Redis 实现缓存机制

    本文章牵涉到的技术点比较多:spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对以上这些技术点有一定的了解或者也可以先看看这篇文章 ...

  3. java403forbidden_java – Spring boot – 返回403 Forbidden而不是重定向到登录页面

    在Spring Boot Web应用程序中,我有以下安全配置: @Override public void configure(HttpSecurity http) throws Exception ...

  4. 【spring boot】5.spring boot 创建web项目并使用jsp作前台页面

    贼烦的是,使用spring boot 创建web项目,然后我再idea下创建的,but 仅仅启动spring boot的启动类,就算整个项目都是好着的,就算是能够进入controller中,也不能成功 ...

  5. Spring Boot内置Tomcat的静态资源配置(在页面中显示项目外的某个图片)

    哇~我现在只想长长的舒一口气,终于解决了 ~    记录一下 好,下面开始我的第一个博客,写的不好还请大家见谅~ Spring Boot项目是在官网自动生成的,目录如下: 在红线圈住的"ap ...

  6. 全网最完美地解决使用spring boot的@Value(“${xxx}“)注解时报出的错误:Could not resolve placeholder ‘xxx‘ in value “${xxx}“

    文章目录 1. 复现问题 2. 分析问题 3. 解决问题 4. 其他解决方案 4.1 检测语法是否正确 4.2 检测配置文件中是否有进行配置 4.3 检测是否增加注解 4.4 检测代码中的书写方式 4 ...

  7. IDEA中Spring Boot+MyBaits提示Invalid bound statement (not found)错误

    记录一下,项目集成遇见问题. 解决方法: 1.查看mapper.xml中 namespace填写是否一致 2.查看mybatis.yml,如下两项配置路径是否与无法找到mapper路径一致 # 配置类 ...

  8. Spring Boot学习总结(22)——如何定制自己的 springboot starter 组件呢?

    引言 我们日常项目中都会用到springboot,只要我们用到springboot,一定会用到各种spring-boot-starter.下面我们通过一个springboot starter 的dem ...

  9. 【spring boot】启动类启动 错误: 找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 的解决方案

    [spring boot]启动类启动 错误: 找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 的解决方案 导入的一个外部的spring boot项目, ...

  10. Spring Boot 全局异常机制

    导语   在项目开发中遇到一个问题,就是通过校验规则判断的内容抛出的异常,并没有被Spring Boot的全局异常捕获机制锁处理.这里提供了如下的解决方案 校验规则引入   在项目的POM文件中引入如 ...

最新文章

  1. 如何读懂MEMS惯性器件的精度指标
  2. AutoML自动化机器学习技术深入
  3. 【计算理论】正则语言 ( 推广型的非确定性有限自动机 GNFA | 删除状态 | 确定性有限自动机 转为 正则表达式 )
  4. 【大学课程】高数基础知识点
  5. [codevs 1302] 小矮人(2002年CEOI中欧信息学奥赛)
  6. linux 无线网卡休眠,无线网卡在Linux下活起来
  7. Python——列表中存放字典遇到的问题
  8. 一个周内上线50个增长策略,竟然能这么高效!
  9. Entity Framework 6.x - Code First 默认创建数据库的位置
  10. TP5 使用redis
  11. python银行管理系统框架_基于Python的网上银行综合管理系统的设计与实现
  12. 手机短信/彩信接口开发经验介绍
  13. 谷歌翻译api小尝试
  14. ROG 2022 款幻 13 评测
  15. 小鸡小猪大历险java_小鸡和小猪
  16. yaml 编码格式简述
  17. 量子计算基础——矩阵语言
  18. ASP.NET4.0中 ValidateRequest=false失效
  19. C#学习笔记----C#连接MySQL数据库
  20. java书籍 李清华_201772020113 李清華《面向對象程序設計(java)》第18周學習總結...

热门文章

  1. 通过JS改变框架的src
  2. BOW(opencv源码)
  3. 拓端tecdat|R语言主题模型LDA评估公司面临的风险领域与可视化
  4. 拓端tecdat|HAR-RV-J与递归神经网络(RNN)混合模型预测和交易大型股票指数的高频波动率
  5. spring5.0学习笔记10
  6. ad中pcb双面板怎么设置_html中表格tr的td单元格怎么设置宽度属性
  7. java接口自动化框架_java接口自动化测试框架及断言详解
  8. python不显示warnings
  9. grep命令--文件过滤分割与合并
  10. sklearn 自定义函数转化器FunctionTransformer使用