重学SpringBoot3-ErrorMvcAutoConfiguration类

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

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 应用的健壮性和用户体验。

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Springboot CAS-Client 是一个基于Springboot框架集成CAS(Central Authentication Service)的客户端。 CAS是一种单点登录(Single Sign-On)协议,它允许用户在一次登录后就能够访问多个应用,而无需重新认证。 Springboot CAS-Client 的作用是充当CAS服务端和应用系统之间的中间件,它负责向CAS服务端发送认证请求,并根据认证结果来管理用户的登录状态。 为了集成CAS,我们首先需要在Springboot项目中引入相应的依赖,例如spring-boot-starter-web和spring-boot-starter-security。接着,我们需要配置CAS服务端的地址信息,包括CAS服务端的登录URL、登出URL以及验证票据的URL等。 在Springboot CAS-Client中,我们也可以自定义一些过滤器和拦截器来实现相关的功能。例如,我们可以编写一个CAS认证过滤器来拦截所有的请求,并判断用户的登录状态。如果用户未登录,则跳转到CAS服务端进行认证;如果用户已登录,则直接放行请求。此外,我们还可以编写一个CAS登出拦截器来处理用户的登出请求,并在登出完成后将用户重定向到指定的页面。 总的来说,Springboot CAS-Client 提供了一个简洁、灵活的方式来集成CAS协议,使得我们的Springboot应用能够享受到单点登录带来的便利。通过它,我们可以轻松地实现用户认证、登录状态管理以及注销等功能,提升用户体验并提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoderJia_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值