52、错误处理-SpringBoot默认错误处理机制
Spring Boot提供了默认的错误处理机制,简化了应用程序在处理异常时的配置。以下是其核心原理和处理流程:
### 1. 默认错误响应
#### 1.1 浏览器请求
- **错误页面**:当浏览器发送请求发生错误时,Spring Boot会自动返回一个默认的**Whitelabel Error Page**,显示HTTP状态码、错误信息和时间戳。
#### 1.2 非浏览器请求(API调用)
- **JSON响应**:对于携带 `Accept: application/json` 请求头的客户端(如Postman、移动应用等),Spring Boot会返回包含错误信息的JSON数据,格式如下:
```json
{
"timestamp": "2025-06-10T09:03:21+08:00",
"status": 500,
"error": "Internal Server Error",
"message": "出错了...",
"path": "/api/endpoint"
}
```
### 2. 关键组件
#### 2.1 `ErrorMvcAutoConfiguration`
自动配置类,负责配置错误处理相关的组件。
#### 2.2 `DefaultErrorAttributes`
- 实现 `ErrorAttributes` 接口,用于收集和封装错误信息。
- 提供 `getErrorAttributes` 方法,将错误信息封装为Map,包含时间戳、状态码、错误消息等。
#### 2.3 `BasicErrorController`
- 处理 `/error` 路径的请求。
- 根据请求的 `Accept` 头,返回HTML页面或JSON数据。
#### 2.4 `DefaultErrorViewResolver`
- 负责解析错误视图,根据HTTP状态码查找对应的错误页面。
### 3. 处理流程
1. **异常发生**:应用程序抛出异常,未被控制器方法捕获。
2. **转发到 `/error`**:Spring MVC将异常请求转发到 `/error` 路径。
3. **`BasicErrorController` 处理**:
- 判断请求的 `Accept` 头:
- 如果是 `text/html`,返回HTML错误页面。
- 如果是 `application/json`,返回JSON格式的错误信息。
4. **获取错误信息**:调用 `DefaultErrorAttributes` 的 `getErrorAttributes` 方法,获取错误信息的Map。
5. **解析错误视图**:
- **模板引擎**:如果有模板引擎(如Thymeleaf),在 `classpath:/templates/error` 目录下查找错误页面。
- 精确匹配:先查找与HTTP状态码对应的 `error/<状态码>.html`,例如 `error/404.html`。
- 模糊匹配:如果找不到精确页面,会查找 `error/<状态码范围>.html`,例如 `error/5xx.html`。
- **静态资源**:如果没有模板引擎,在 `classpath:/static/error` 目录下查找对应的HTML页面。
6. **返回响应**:
- 如果是HTML请求,渲染错误页面并返回。
- 如果是JSON请求,返回包含错误信息的JSON响应。
### 4. 自定义错误处理
#### 4.1 自定义错误页面
- 在 `classpath:/templates/error` 或 `classpath:/static/error` 目录下创建对应的错误页面,例如 `error/404.html`、`error/500.html`。
#### 4.2 自定义错误信息
- 实现 `ErrorAttributes` 接口,自定义错误信息的收集和封装。
- 使用 `@Bean` 注解将自定义的 `ErrorAttributes` 注入容器,覆盖默认的 `DefaultErrorAttributes`。
#### 4.3 全局异常处理
- 使用 `@ControllerAdvice` 和 `@ExceptionHandler` 注解,全局捕获并处理特定类型的异常。
```java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MyException.class)
public ResponseEntity<String> handleMyException(MyException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("处理自定义异常:" + ex.getMessage());
}
}
```
### 总结
Spring Boot的默认错误处理机制能够自动适应不同类型的客户端请求,提供友好的错误页面或详细的JSON响应。通过理解其原理,开发人员可以根据实际需求进行自定义配置,提升应用程序的异常处理能力和用户体验。