52、错误处理-SpringBoot默认错误处理机制

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响应。通过理解其原理,开发人员可以根据实际需求进行自定义配置,提升应用程序的异常处理能力和用户体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值