重学SpringBoot3-ErrorMvcAutoConfiguration类

重学SpringBoot3-ErrorMvcAutoConfiguration类

CoderJia 22 2024-03-15

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 {

    @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 属性到错误响应中。这个属性可以在错误控制器或错误页面中使用,从而提供更丰富的错误信息。

自定义customMessage

结论

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