重学SpringBoot3-ErrorMvcAutoConfiguration类

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》

重学SpringBoot3-ErrorMvcAutoConfiguration类

  • ErrorMvcAutoConfiguration类的作用
  • 工作原理
  • 定制 `ErrorMvcAutoConfiguration`
  • 示例代码
    • 1. 添加自定义错误页面
    • 2.自定义错误控制器
    • 3. ErrorAttributes定制错误信息
  • 结论

ErrorMvcAutoConfiguration 类是 Spring Boot 中用于自动配置错误处理机制的一个关键组件。这篇文章将详细介绍 ErrorMvcAutoConfiguration类,包括其作用、工作原理以及如何在 Spring Boot 3 应用中定制和使用它。

ErrorMvcAutoConfiguration类的作用

org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

自动配置类

在 Spring Boot 应用中,当应用遇到运行时异常或者请求映射到不存在的路径时,ErrorMvcAutoConfiguration 类负责自动配置错误处理的相关机制。它确保应用能够以一种友好的方式向用户反馈错误信息,而不是显示标准的错误堆栈信息或空白页。

ErrorMvcAutoConfiguration 提供了一个默认的错误处理页面,并且允许开发者通过添加自定义的错误页面来覆盖默认设置,提高应用的用户体验。

工作原理

ErrorMvcAutoConfiguration 利用 Spring MVC 的异常处理机制来捕捉应用中的各种错误,并将错误信息映射到相应的错误处理控制器。默认情况下,它会映射到 /error 路径。当错误发生时,Spring MVC 会自动重定向到这个路径,并由 BasicErrorController 处理请求,最终返回一个错误视图。

开发者可以通过实现 ErrorViewResolver 接口来自定义错误页面的解析逻辑,或者通过实现 ErrorController 接口并注册为 Bean 来完全控制错误处理的逻辑。

ErrorController

  • errorHtml 方法: 这个方法用于处理 HTTP 请求并返回一个包含错误信息的 HTML 页面。它首先获取 HTTP 请求的状态码,然后创建一个不可修改的 Map 对象,用于存储错误信息。接着设置响应的状态码为请求的状态码,然后调用 resolveErrorView 方法来解析错误视图。最后,如果 resolveErrorView 方法返回了一个非空的 ModelAndView 对象,那么就返回这个对象,否则返回一个新的 ModelAndView 对象,其中包含"error"作为视图名称和之前创建的错误信息模型。
  • error 方法: 这个方法用于处理 HTTP 请求并返回一个包含错误信息的 JSON 对象。它首先获取 HTTP 请求的状态码,然后判断状态码是否为 NO_CONTENT,如果是,则直接返回一个包含状态码的 ResponseEntity 对象。接下来,它创建一个包含错误信息的 Map 对象,并将其与状态码一起封装在一个 ResponseEntity 对象中返回。

返回错误页面的流程

  1. 使用 resolveErrorView 解析错误的自定义视图地址;
  2. 解析过程:
    1. 如果发生了500、404、503、403 这些错误
      1. 如果有模板引擎,默认在 classpath:/templates/error/精确码.html
      2. 如果没有模板引擎,在静态资源文件夹下找 精确码.html
    2. 如果匹配不到 精确码.html这些精确的错误页,就去找 5xx.html4xx.html模糊匹配
      1. 如果有模板引擎,默认在 classpath:/templates/error/5xx.html
      2. 如果没有模板引擎,在静态资源文件夹下找 5xx.html
  3. new ModelAndView("error", model):如果解析不到错误页面的地址,默认的错误页就是 error;

定制 ErrorMvcAutoConfiguration

在Spring Boot 3中,定制 ErrorMvcAutoConfiguration 的方式主要有以下几种:

  1. 添加自定义错误页面:在 src/main/resources/static/error 目录下添加自定义的错误页面,如 404.html500.html 等。Spring Boot 会自动识别这些页面,并在相应的错误发生时使用它们。
  2. 自定义错误控制器:通过创建一个实现了 ErrorController 接口的Bean,可以自定义错误处理逻辑。例如,可以在这个控制器中添加日志记录,或者根据不同的错误类型返回不同的视图或数据格式。
  3. 使用 ErrorAttributes:Spring Boot 提供了 ErrorAttributes 接口,允许开发者在控制器或视图中访问错误相关的属性(如状态码、错误消息等)。这可以用来创建更丰富的错误信息反馈。

示例代码

1. 添加自定义错误页面

在Spring Boot应用中,可以通过在 src/main/resources/static/error目录下添加错误页面来自定义错误响应。例如,对于404错误(页面未找到),可以添加一个名为 404.html的页面。同样地,对于500错误(服务器内部错误),可以添加一个名为 500.html的页面。Spring Boot会自动识别并在相应的错误发生时使用这些页面。

示例代码:

假设你已经创建了 404.html500.htmlsrc/main/resources/static/error目录下,无需其他配置,Spring Boot会自动使用这些页面响应相应的错误。

自定义404页面

2.自定义错误控制器

下面是一个简单的自定义错误控制器 ErrorController 的示例:

package com.coderjia.springboot304web.controller;import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author CoderJia* @create 2024/03/12 9:09* @Description**/
@RestController
public class MyCustomErrorController implements ErrorController {@RequestMapping("/error")public String handleError(HttpServletRequest request) {// 从请求中获取错误状态码Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);if (status != null) {int statusCode = Integer.parseInt(status.toString());if (statusCode == HttpStatus.NOT_FOUND.value()) {return "Error 404: Page not found";} else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {return "Error 500: Internal server error";}}return "Error: unknown";}
}

自定义错误信息

通过这种方式,开发者可以根据不同的错误类型提供不同的处理逻辑和反馈信息。

3. ErrorAttributes定制错误信息

Spring Boot 允许通过 ErrorAttributes 接口定制错误信息,开发者可以使用这个接口来获取或修改错误详情。这些信息然后可以在自定义的错误控制器或错误视图中使用。

创建一个类来扩展 DefaultErrorAttributes 类,可以添加或修改错误属性:

package com.coderjia.springboot304web.config;import org.springframework.boot.web.error.ErrorAttributeOptions;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest;import java.util.Map;/*** @author CoderJia* @create 2024/03/12 9:13* @Description**/
@Component
public class CustomErrorAttributes extends DefaultErrorAttributes {@Overridepublic Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, options);// 可以在此处添加自定义属性errorAttributes.put("customMessage", "Something went wrong!");return errorAttributes;}
}

在这个例子中,我们添加了一个 customMessage 属性到错误响应中。这个属性可以在错误控制器或错误页面中使用,从而提供更丰富的错误信息。

自定义customMessage

结论

ErrorMvcAutoConfiguration 类是 Spring Boot 中用于错误处理的重要组件,它提供了一个简便的机制来自动配置错误处理逻辑,同时也提供了多种方式供开发者根据需求定制错误处理。通过合理使用 ErrorMvcAutoConfiguration,可以提高 Spring Boot 应用的健壮性和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习记录(十七)IO流(三)

转换流&#xff08;在字节流中想使用字符流的方法时使用&#xff09; 转换流是字节流和字符流之间的桥梁&#xff0c;转换流本身其实就是字符流所以可以使用字符流里的相关方法&#xff0c;通过InputStreamReader字符转换输入流能将字节流转化为字符流输入到内存中&#xff0c…

YOLOv8改进 | 注意力机制 | 添加YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM,SEAM(Spatially Enhanced Attention Module)注意力网络模块旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来实现这一目标,其希望通过学习遮挡面和未遮挡面之间的…

.net core框架

ASP.NET Core 入门 跨平台开源框架 B/S 类与方法 Console 部分称为“类”。 类“拥有”方法&#xff1b;或者可以说方法存在于类中。 WriteLine() 部分称为“方法”。 想要使用方法就要知道方法在哪里 —————————— 执行流 一次执行一段 ASP.NET Core 是什么东西…

VikeCTF 2024

VikeCTF 2024 WP 由于环境原因很多靶场的过程图片没法复现截图。。。 web Ponies 算是一个签到题&#xff0c;看到源码这里其实是一个快速跳转的程序&#xff0c;我们看到tag.src直接进行访问&#xff0c;可以看到源码里面&#xff0c;从里面分析拿到flag function recurs…

流畅的Python(十八)-使用asyncio包处理并发

一、核心要义 1. 对比一个简答的多线程程序和对应的asyncio版,说明多线程和异步任务之间的关系 2. 网络下载的异步版 3. 在异步编程中,与回调相比&#xff0c;协程显著提升性能的方式 二、代码示例 1、相关知识点 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time …

算法50:动态规划专练(力扣514题:自由之路-----4种写法)

题目: 力扣514 &#xff1a; 自由之路 . - 力扣&#xff08;LeetCode&#xff09; 题目的详细描述&#xff0c;直接打开力扣看就是了&#xff0c;下面说一下我对题目的理解: 事例1&#xff1a; 输入: ring "godding", key "gd" 输出: 4. 1. ring的第…

RStudio更换R语言版本

今天下载R语言用于读取.xlsx文件的readxl包时&#xff0c;RStudio提示该包是使用R-4.3.3版本构建&#xff0c;而我现在使用的是R-4.3.2版本&#xff0c;所以需要升级一下R语言版本&#xff0c;这里先下载最新版本的R语言&#xff0c; 下载地址&#xff1a;The Comprehensive R…

Jenkins自动构建 CI/CD流水线学习笔记(从入门到入土,理论+示例)

文章目录 1、什么是Jenkins的流水线?2、流水线语法2.1、声明式流水线2.2、脚本化流水线 3、流水线示例3.1、使用声明式流水线的语法编写的 Jenkinsfile 文件3.2、Pipeline 各种语言示例3.2.1 Java&#xff1a;3.2.2 Node.js / JavaScript3.2.3 Python 4、一套完整的Devops Jen…

【ICCV21】Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

文章目录 0. Abstract1. Introduction2. Related Work3. Method3.1 Overall Architecture3.2 Shifted Window based Self-Attention3.3 Architecture Variants 4. Experiments4.1 Image Classification on ImageNet-1K4.2 Object Detection on COCO4.3 Semantic Segmentation o…

基于JavaWeb开发的springboot网咖管理系统[附源码]

基于JavaWeb开发的springboot网咖管理系统[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &a…

【办公类-40-02】20240311 python模仿PPT相册功能批量插入照片,更改背景颜色 (家长会系列二)

作品展示——用Python插入PPT相册 背景需求&#xff1a; 马上就要家长会&#xff0c;我负责做会议前的照片滚动PPT&#xff0c;通常都是使用PPT的相册功能批量导入照片&#xff0c; 生成给一个新的PPT文件 更改背景颜色 设置4秒间隔&#xff0c;应用到全部 保存&#xff0c;改…

Hadoop伪分布式配置--没有DataNode或NameNode

一、原因分析 重复格式化NameNode 二、解决方法 1、输入格式化NameNode命令&#xff0c;找到data和name存放位置 ./bin/hdfs namenode -format 2、删除data或name&#xff08;没有哪个删哪个&#xff09; sudo rm -rf data 3、重新格式化NameNode 4、重新启动即可。

sheng的学习笔记- AI-类别不平衡问题

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 什么是类别不平衡问题 类别不平衡&#xff08;class-imbalance&#xff09;&#xff0c;也叫数据倾斜&#xff0c;数据不平衡&#xff0c;就是指分类任务中不同类别的训练样例数目差别很大的情况。 例如有998个反例&#xf…

vue3全局引入element-plus后怎么使用Message进行消息提示

全局引入 main.ts import element-plus/dist/index.css 在需要使用提示的组件中引入 import { ElMessage } from element-plus 使用举例

Verilog刷题笔记37

题目&#xff1a;3位二进制加法器 Now that you know how to build a full adder, make 3 instances of it to create a 3-bit binary ripple-carry adder. The adder adds two 3-bit numbers and a carry-in to produce a 3-bit sum and carry out. To encourage you to actua…

@Conditional注解详解

目录 一、Conditional注解作用 二、Conditional源码解析 2.1 Conditional源码 2.2 Condition源码 三、Conditional案例 3.1 Conditional作用在类上案例 3.1.1 配置文件 3.1.2 Condition实现类 3.1.3 Bean内容类 3.1.4 Config类 3.1.5 Controller类 3.1.6 测试结果 3…

Visual grounding-视觉定位任务介绍

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

Spring Cloud Alibaba微服务从入门到进阶(一)

Springboot三板斧 1、加依赖 2、写注解 3、写配置 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的一系列用于监控和管理应用程序的工具和服务。 SpringBoot导航端点 其中localhost:8080/actuator/health是健康检查端点&#xff0c;加上以下配置&#xf…

基于element-plus的Dialog选择控件

翻看之前工程师写的vue2的代码&#xff0c;很多都是复制、粘贴&#xff0c;也真是搞不懂&#xff0c;明明可以写一个控件&#xff0c;不就可以重复使用。很多前端总喜欢element搞一下&#xff0c;ant-design也搞一下&#xff0c;有啥意义&#xff0c;控件也不是自己写的&#x…

Python递归函数你用对了吗?

1.递归函数 递归函数&#xff1a;函数自己调用自己 2.需求 使用函数的方式&#xff0c;计算数字n的阶乘 # 5&#xff01; """ 5! 1 * 2 * 3 * 4 * 5 4! 1 * 2 * 3 * 4 3! 1 * 2 * 3 2! 1 * 2 1! 1综上可以总结出&#xff1a;n! n * (n - 1) "&qu…