6. springboot-----默认的错误处理机制

本文深入剖析SpringBoot的错误处理机制,包括ErrorPageCustomizer的作用、BasicErrorController如何处理/error请求,以及DefaultErrorViewResolver如何解析错误页面。同时,介绍了自定义错误页面的三种方式,以及如何自定义错误响应数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




1. 出现错误时页面效果

1. 浏览器发送一个不存在的请求时,会报404

在这里插入图片描述



2. 服务器内部发生错误的时候,页面会返回什么呢?(500)

在这里插入图片描述

在这里插入图片描述



3. 通过上面,我们会发现无论是发生什么错误,SpringBoot 都会返回一个状态码以及一个错误页面,这个错误页面是怎么来的呢?(我看不懂)
  • 分析底层原理分析
  1. ErrorPageCustomizer 错误页面定制器
    在这里插入图片描述
    当应用出现了4xx或5xx之类的错误 ,ErrorPageCustomizer就会被激活,它主要 用于定制错误 处理的响应规则,
    就会发送一个/error请求,它会交给 BasicErrorController进行处理

  1. BasicErrorController 就会接收 /error 请求处理。
    在这里插入图片描述
    BasicErrorController 会接收一个/error请求, 两个 方法处理,第1个erroHtml响应html数据, 还有一个error用
    来响应json数据 的, 使用了 ErrorViewResolver (DefaultErrorViewResolver)组件进行封装视图

  1. DefaultErrorViewResolver 去解析具体响应的错误页面。(下面是部分代码)
    在这里插入图片描述
    通过以上分析则可以自定义错误页面

  1. DefaultErrorAttributes 错误页面可获取到的数据信息
    在这里插入图片描述
    通过 BasicErrorController 的方法中响应的 module 可定位到响应哪些数据,从而引出 ErrorAttributes 的实
    现类 DefaultErrorAttributes , DefaultErrorAttributes 中绑定的所有值都可在页面获取到。

总结:

  1. 每次出现错误之后,它会自动在我们的文件夹中寻找是否定义了相应的错误文件,这个时候templates文件夹中有相应文件它会优先;
  2. 有两种选择方式,一种精确匹配(500.xml),一种模糊匹配(5xx.xml),这个时候它会准确匹配优先;
  3. 我们还可以获取错误中的一些其他信息,我们可以通过 thymeleaf 的语法进行获取(具体如下 4. )

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述



4. 下面省略一大波可获取的数据

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




2. 自定义错误响应页面

1. 第1种 :有模板引擎

error/状态码 : 精确匹配,将错误页面命名为 错误状态码.html 放在模板引擎目录 templates 下
的 error 目录下,发生对应状态码错误时,就会响应对应的模板页面
error/4xx 、error/5xx :模糊匹配, 可以将错误页面命名为 4xx 和 5xx ,有来匹配对应类型的
所有错误
采用精确优先
错误页面可获取的的数据信息

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

2. 第2种:没有模板引擎 (模板引擎找不到对应错误页面)

          静态资源目录下的 error 目录中找


3. 第3种: 模板目录与静态目录下都找不到对应错误页面,就响应 SpringBoot 默认的错误页面

          通过 BasicErrorController 的 errorhtml 方法最后 一行可知,没有找到则找 error 视图对象 ,error定义
在 ErrorMvcAutoConfiguration 的 defaultErrorView 中
在这里插入图片描述


3. 自定义数据进行响应

1.分析

出现错误以后,会发送 /error 请求,会被 BasicErrorController 处理,而响应的数据是由
getErrorAttributes 封装的(就是 ErrorController 的实现类 AbstractErrorController.getErrorAttributes 的方法),
所以我们只需要自定义 ErrorAttributes 实现类即可



2. 自定义 ErrorAttributes(这个定义的是只要有异常,就能获取这个我们自定义的错误信息)

在这里插入图片描述

3. 错误页面获取(404和500都可以获取,当然我们这里也定义了500的错误页面)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

<think>嗯,用户询问的是关于SpringBoot配置`spring.output.ansi.console-available`的作用,这涉及到日志输出格式的专业问题。从用户之前的对话看,已经讨论过AnsiOutputApplicationListener的基本原理。现在需要专门解释这个特定配置项。这个配置通常不会直接使用,但理解它有助于掌握SpringBoot的ANSI工作机制。查阅SpringBoot官方文档发现,`spring.output.ansi.console-available`属于环境条件属性。它的核心作用是标识当前控制台是否具备ANSI编码处理能力。考虑设计三个使用场景:首先在桌面开发环境中,系统终端原生支持ANSI编码;其次在Windows命令提示符环境,需要配合Jansi等库实现兼容;最后在无交互的环境(如CI/CD流水线)则自动禁用ANSI避免乱码。注意到用户提供的引用[3]提到日志格式配置,这与ANSI输出有直接关联。当控制台可用时,结合`spring.output.ansi.enabled`配置就能动态渲染彩色日志。特别说明两者的优先级关系很重要:即使声明控制台可用,用户显式设置`enabled=never`仍会强制禁用颜色输出。准备用LaTeX公式解释控制台检测逻辑的概率模型:$$P(\text{启用ANSI})=P(\text{console-available}\cap\text{enabled}\neq\text{NEVER})$$。这个模型能直观展示多条件判断关系。最后需要提醒实践建议。大多数情况下都不需要手动配置这个属性,除非遇到特殊终端兼容问题。如果用户确实需要覆盖自动检测机制,才需要在application.properties里显式声明。</think> `spring.output.ansi.console-available` 是 Spring Boot 中用于**显式声明终端对 ANSI 颜色支持能力的配置项**。它并非直接控制颜色输出,而是为系统提供环境状态的明确声明,作用如下: --- ### 一、核心作用 1. **绕过自动检测机制** Spring Boot 默认通过 `AnsiOutputApplicationListener` 自动检测终端是否支持 ANSI 颜色(例如:Unix 终端支持,Windows 需 Jansi 库支持[^1])。配置此项可**覆盖自动检测结果**: ```properties spring.output.ansi.console-available=true # 强制声明终端支持ANSI spring.output.ansi.console-available=false # 强制声明终端不支持 ``` 2. **与其他配置协同工作** 该配置需结合 `spring.output.ansi.enabled` 生效: - 当 `console-available=true` 时,`enabled` 的 `DETECT/ALWAYS/NEVER` 才生效 - 若 `console-available=false`,无论 `enabled` 如何设置,**ANSI 输出均被禁用** 逻辑关系可表示为: $$ \text{最终启用ANSI} = \begin{cases} \text{false} & \text{if } \text{console-available=false} \\ \text{取决于 }\texttt{enabled}\text{ 配置} & \text{if } \text{console-available=true} \end{cases} $$ 3. **解决特殊场景问题** 例如: - 在 IDE 中运行应用时,某些旧版本终端模拟器报告错误的支持状态 - CI/CD 流水线中容器环境需强制启用/禁用颜色 --- ### 二、典型配置示例 ```yaml # 强制声明终端支持ANSI,并启用颜色输出 spring: output: ansi: console-available: true enabled: ALWAYS # 显式禁用所有ANSI输出(优先级最高) spring: output: ansi: console-available: false ``` --- ### 三、为何需要此配置? | 场景 | 未配置时 | 配置后 | |--------------------------|---------------------------------|-------------------------------| | Windows 无 Jansi 库 | 自动禁用颜色输出 | 声明 `true` + `ALWAYS` 可强制启用 | | 容器环境不支持颜色 | 日志出现乱码 | 声明 `false` 避免乱码 | | IDE 错误报告终端能力 | 颜色显示异常 | 显式声明正确状态 | --- ### 四、实践建议 1. **通常无需配置**:Spring Boot 的自动检测机制已覆盖多数场景[^1] 2. **仅在遇到终端兼容性问题时使用**:如日志颜色乱码、颜色无法显示 3. **优先调整 `enabled` 配置**: ```properties # 直接控制开关(无需改 console-available) spring.output.ansi.enabled=ALWAYS ``` > ⚠️ 注意:该配置项在 Spring Boot 2.7 后已被标记为 `Deprecated`,官方推荐直接通过 `spring.output.ansi.enabled` 控制行为[^3]。 --- ### 相关问题 1. `spring.output.ansi.enabled` 和 `console-available` 同时配置时的优先级规则是什么? 2. 如何在 Docker 容器中正确配置 ANSI 颜色输出? 3. Spring Boot 3.x 中废弃 `console-available` 后的替代方案是什么? [^1]: Spring Boot 自动检测终端能力时需区分操作系统特性[^1] [^3]: 通过直接控制 `spring.output.ansi.enabled` 可覆盖大多数需求[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值