SpringBoot之自定义启动异常堆栈信息打印方式

下面是关于“SpringBoot之自定义启动异常堆栈信息打印方式”的完整攻略。

1. 概述

在 SpringBoot 中,我们经常遇到启动应用时发生异常的情况,而默认的异常信息打印方式并不友好,难以定位问题。因此,本文将介绍如何通过自定义异常处理器,实现启动异常堆栈信息的定制化打印。

2. 实现步骤

2.1 创建异常处理器类

首先,我们需要创建一个异常处理器类,用于处理启动异常时的情况。该类需要继承自 ErrorController 接口,并且要带有 @RestController@RequestMapping@Order 注解。

@RestController
@RequestMapping("/error")
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomErrorController implements ErrorController {

    private static final Logger LOGGER = LoggerFactory.getLogger(CustomErrorController.class);

    @RequestMapping
    public String error(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");

        // 异常信息输出到日志中
        LOGGER.error("Exception during startup", exception);

        // 返回友好的异常提示信息
        return "Sorry, the server encountered an error:" + statusCode;
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }

}

在这个类中,我们首先获取了异常的状态码和异常对象,然后将异常信息输出到日志中。最后,返回一个友好的提示信息。

2.2 注册异常处理器

接下来,我们需要将自定义的异常处理器注册到 SpringBoot 中。我们可以通过创建一个 Spring @Configuration 类,并在其中添加 EmbeddedServletContainerCustomizer 实例来实现。

@Configuration
public class CustomExceptionHandler {

    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {

        return container -> {
            ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/error");
            ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/error");
            ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error");

            container.addErrorPages(error401Page, error404Page, error500Page);
        };
    }

}

这里我们定义了三个错误页面:401、404 和 500。这里的 /error 是我们在前面定义的异常处理器的路由地址。

3. 示例说明

假设我们的 SpringBoot 项目启动时,发生了一个空指针异常,那么我们如何打印出友好的堆栈信息呢?

3.1 通过默认方式打印异常信息

首先,我们看看默认的异常信息打印方式:

***************************
APPLICATION FAILED TO START
***************************
Description:

Parameter 0 of constructor in com.example.demo.controller.UserController required a bean of type 'com.example.demo.service.UserService' that could not be found.


Action:

Consider defining a bean of type 'com.example.demo.service.UserService' in your configuration.

从上面的信息中可以看出,在构造 UserController 时,缺少了 UserService 类型的 Bean 对象。但是这个默认信息并不能更好地帮助我们找到问题的根源。

3.2 通过自定义方式打印异常信息

接下来,我们使用自定义异常处理器,看看对比效果如何。

我们启动项目后,可以在控制台中看到如下日志:

2022-02-22 10:10:10.123 ERROR CustomErrorController:24 - Exception during startup
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo.service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

2022-02-22 10:10:10.123  WARN SpringApplication:558 - Error handling failed (ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@c0ac64f): org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo.service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

***************************
APPLICATION FAILED TO START
***************************
Description:

Parameter 0 of constructor in com.example.demo.controller.UserController required a bean of type 'com.example.demo.service.UserService' that could not be found.


Action:

Consider defining a bean of type 'com.example.demo.service.UserService' in your configuration.

可以看出,在自定义的异常处理器中,我们成功地输出了出错的具体堆栈信息。通过这些信息,我们可以更快地定位和解决问题。

4. 总结

通过本文的介绍,我们可以看到,自定义异常处理器可以帮助我们更好地定位、捕获和处理启动异常。在实际项目开发中,建议使用自定义异常处理器,提高项目的可靠性和稳定性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot之自定义启动异常堆栈信息打印方式 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Hibernate Validator实现更简洁的参数校验及一个util

    那我来为您讲解一下Hibernate Validator实现更简洁的参数校验及一个util的完整攻略。 1. 简介 Hibernate Validator是一个基于Java Bean验证规范(JSR-303,JSR-349)的校验框架,可以用来校验JavaBean中的字段,包括对基本类型、日期、字符串等数据类型的支持。Hibernate Validator提…

    Java 2023年5月20日
    00
  • Android发送GET与POST请求的DEMO详解

    下面我将为你详细讲解“Android发送GET与POST请求的DEMO详解”这个主题,包括以下几个方面的内容: 什么是HTTP请求 Android中发送HTTP请求的方式 完整示例:Android发送GET请求 完整示例:Android发送POST请求 什么是HTTP请求 HTTP(HyperText Transfer Protocol)是一种用于传输数据的…

    Java 2023年6月15日
    00
  • SpringBoot接口如何统一异常处理

    概述 在应用程序设计中,异常处理一直是一个很重要的话题。当应用程序发生异常时,它可能停止工作,或者转变成一个不可预期的状态,从而影响到用户的体验。因此,为了保证系统的可用性、可维护性和可扩展性,我们肯定需要处理异常。SpringBoot提供了一种统一的异常处理方式,能够快速捕获并处理所有异常情况,这也是SpringBoot越来越受欢迎的原因之一。 实现 实现…

    Java 2023年5月20日
    00
  • JBuilder2005单元测试之JUnit框架

    JBuilder 2005单元测试之JUnit框架攻略 什么是JUnit框架? JUnit是Java编程语言的编写单元测试的一个开源框架。其主要特点是简单易学,同时提供了丰富的API接口,可以很方便地进行单元测试和集成测试。 JBuilder 2005中如何使用JUnit框架? 安装JUnit框架 首先,需要从JUnit的官方网站(https://junit…

    Java 2023年6月15日
    00
  • JavaSpringBoot报错“ConflictException”的原因和处理方法

    原因 “ConflictException” 错误通常是以下原因引起的: 数据库冲突:如果您的数据库存在冲突,则可能会出现此错误。在这种情况下,需要检查您的数据库并确保它们正确。 代码逻辑问题:如果您的代码逻辑存在问题,则可能会出现此错误。在这种情况下,需要检查您的代码逻辑并确保它们正确。 并发问题:如果您的应用程序存在并发问题,则可能会出现此错误。在这种情…

    Java 2023年5月4日
    00
  • 简单了解JAVA NIO

    Java NIO 简介 Java NIO即Java非阻塞式IO (Java Non-blocking I/O)。Java NIO提供了一种新的 IO工作方式和API。它比原生的Java IO(Java IO通过流的方式读取数据,而NIO则是通过通道(channel)和缓冲区(buffer)来读取数据)更加高效,也更易于扩展。虽然Java NIO比Java I…

    Java 2023年5月24日
    00
  • kafka手动调整分区副本数的操作步骤

    当需要手动调整Kafka集群中的某个主题的分区副本数时,可以通过添加或删除分区副本来实现。下面是手动调整分区副本数的操作步骤: 打开Kafka集群管理界面,例如Kafka Manager或Apache Kafka Web Console。 选择需要调整分区副本数的主题,点击进入主题管理页面。 打开分区列表,选择需要调整分区副本数的分区(例如第3个分区)。 点…

    Java 2023年5月20日
    00
  • Java的Struts框架报错“NullActionForwardException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“NullActionForwardException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此。在这种情况下,需要检查文件以解决此问题。 转发名称:如果转发名称不正确,则可能出现此。在这种情况下,需要检查转发名称以解决此问题。 以下是两个实例: 例 1 如果配置…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部