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 来完全控制错误处理的逻辑。
errorHtml
方法: 这个方法用于处理 HTTP 请求并返回一个包含错误信息的 HTML 页面。它首先获取 HTTP 请求的状态码,然后创建一个不可修改的 Map 对象,用于存储错误信息。接着设置响应的状态码为请求的状态码,然后调用resolveErrorView
方法来解析错误视图。最后,如果resolveErrorView
方法返回了一个非空的ModelAndView
对象,那么就返回这个对象,否则返回一个新的ModelAndView
对象,其中包含"error"作为视图名称和之前创建的错误信息模型。error
方法: 这个方法用于处理 HTTP 请求并返回一个包含错误信息的 JSON 对象。它首先获取 HTTP 请求的状态码,然后判断状态码是否为 NO_CONTENT,如果是,则直接返回一个包含状态码的ResponseEntity
对象。接下来,它创建一个包含错误信息的 Map 对象,并将其与状态码一起封装在一个ResponseEntity
对象中返回。
- 使用
resolveErrorView
解析错误的自定义视图地址; - 解析过程:
- 如果发生了500、404、503、403 这些错误
- **如果有模板引擎,默认在 **
classpath:/templates/error/精确码.html
- **如果没有模板引擎,在静态资源文件夹下找 **
精确码.html
- **如果有模板引擎,默认在 **
- **如果匹配不到 **
精确码.html
这些精确的错误页,就去找5xx.html
,4xx.html
模糊匹配- **如果有模板引擎,默认在 **
classpath:/templates/error/5xx.html
- **如果没有模板引擎,在静态资源文件夹下找 **
5xx.html
- **如果有模板引擎,默认在 **
- 如果发生了500、404、503、403 这些错误
new ModelAndView("error", model)
:如果解析不到错误页面的地址,默认的错误页就是 error;
定制 ErrorMvcAutoConfiguration
在Spring Boot 3中,定制 ErrorMvcAutoConfiguration
的方式主要有以下几种:
- 添加自定义错误页面:在
src/main/resources/static/error
目录下添加自定义的错误页面,如404.html
、500.html
等。Spring Boot 会自动识别这些页面,并在相应的错误发生时使用它们。 - 自定义错误控制器:通过创建一个实现了
ErrorController
接口的Bean,可以自定义错误处理逻辑。例如,可以在这个控制器中添加日志记录,或者根据不同的错误类型返回不同的视图或数据格式。 - 使用
ErrorAttributes
:Spring Boot 提供了ErrorAttributes
接口,允许开发者在控制器或视图中访问错误相关的属性(如状态码、错误消息等)。这可以用来创建更丰富的错误信息反馈。
示例代码
1. 添加自定义错误页面
在Spring Boot应用中,可以通过在 src/main/resources/static/error
目录下添加错误页面来自定义错误响应。例如,对于404错误(页面未找到),可以添加一个名为 404.html
的页面。同样地,对于500错误(服务器内部错误),可以添加一个名为 500.html
的页面。Spring Boot会自动识别并在相应的错误发生时使用这些页面。
示例代码:
假设你已经创建了 404.html
和 500.html
在 src/main/resources/static/error
目录下,无需其他配置,Spring Boot会自动使用这些页面响应相应的错误。
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 {
@Override
public 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
属性到错误响应中。这个属性可以在错误控制器或错误页面中使用,从而提供更丰富的错误信息。
结论
ErrorMvcAutoConfiguration
类是 Spring Boot 中用于错误处理的重要组件,它提供了一个简便的机制来自动配置错误处理逻辑,同时也提供了多种方式供开发者根据需求定制错误处理。通过合理使用 ErrorMvcAutoConfiguration
,可以提高 Spring Boot 应用的健壮性和用户体验。