Springboot启动报错时实现异常定位

yizhihongxing

当Springboot项目启动时,我们经常会遇到各种报错。如果不好好处理这些错误,会导致项目无法正常启动,严重影响开发效率。本文将介绍如何对于Springboot启动报错时,实现异常定位的方法。

1. 查看控制台日志

当Springboot项目启动发生错误时,应该首先查看控制台日志。控制台日志中记录了Springboot项目所有的启动过程信息,包括启动的顺序、加载的bean、启动的缓存等等。掌握控制台日志的读取能力,能够帮助我们快速定位异常所在的位置。

下面是一个控制台日志示例:

2021-08-10 08:12:31.968  INFO 45604 --- [           main] c.i.s.test.SpringbootTestApplication    : Starting SpringbootTestApplication v0.0.1-SNAPSHOT on LAPTOP-PDT9I5T4 with PID 45604 (/Users/Jack/Documents/SpringbootTest/target/classes started by Jack in /Users/Jack/Documents/SpringbootTest)
2021-08-10 08:12:31.970  INFO 45604 --- [           main] c.i.s.test.SpringbootTestApplication    : No active profile set, falling back to default profiles: default
2021-08-10 08:12:32.325  INFO 45604 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFERRED mode.
2021-08-10 08:12:32.389  INFO 45604 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 50 ms. Found 1 JPA repository interfaces.
2021-08-10 08:12:32.758  INFO 45604 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-08-10 08:12:32.847  INFO 45604 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.32.Final

上面的控制台日志中包含了SpringbootTestApplication项目的启动过程,我们可以通过日志中的信息进行排查错误原因。

2. 调整日志级别

当发现控制台日志无法给出足够的提示信息时,我们可以尝试调整日志级别。通过调整日志级别,我们可以只打印出我们关心的信息,从而更好的定位到异常。

在Springboot项目中,我们可以通过配置yml文件来调整日志级别。具体的配置方式如下:

logging:
  level:
    org.springframework.web: ERROR
    com.example: DEBUG

上面的配置中,我们为Spring框架设置了ERROR级别,只打印出错误信息;同时为我们自己的com.example包设置了DEBUG级别,能够打印出调试信息,方便我们进行异常定位。

示例说明

下面提供两个示例,说明如何通过控制台日志和日志级别调整来定位Springboot异常。

示例1:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }

}

当我们启动上面的Springboot项目时,控制台会输出如下的错误:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-08-10 08:33:04.019 ERROR 49558 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:806) ~[spring-boot-2.5.3.jar:2.5.3]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:797) ~[spring-boot-2.5.3.jar:2.5.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-2.5.3.jar:2.5.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.3.jar:2.5.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.3.jar:2.5.3]
    at com.example.demo.DemoApplication.main(DemoApplication.java:10) ~[classes/:na]
Caused by: java.lang.NullPointerException: null
    at com.example.demo.DemoApplication.run(DemoApplication.java:21) ~[classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:803) ~[spring-boot-2.5.3.jar:2.5.3]
    ... 4 common frames omitted

从上面的日志中我们可以发现,应用在执行CommandLineRunner的时候发生了异常。跟踪日志发现,空指针异常发生在com.example.demo.DemoApplication.run方法的第21行,这帮助我们定位到了异常。

销毁示例中的代码我们会发现,原来异常的发生是因为没有注入一个依赖,代码如下:

@Component
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private TestService testService;

    @Override
    public void run(String... args) throws Exception {
        testService.doSomething();
    }
}

当我们注入这个依赖后,异常得到了解决。

示例2:

在这个例子中,我们创建了一个ServletInitializer来配置servlet容器,同时为了方便起见,我们将日志打印级别调整为DEBUG。

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringbootTestApplication.class);
    }

    static {
        System.setProperty("logging.level.root", "DEBUG");
    }

}

当我们启动这个项目时,控制台日志输出大量的DEBUG级别的信息,能够帮助我们快速定位到问题。下面是一个示例的日志内容:

2021-08-10 09:03:19.040  INFO 50235 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-08-10 09:03:19.114 DEBUG 50235 --- [           main] o.s.w.s.h.BeanNameUrlHandlerMapping     : Rejected bean name 'controller' (for URL pattern '/test.txt') behind existing handler of type [class org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]
2021-08-10 09:03:19.175 DEBUG 50235 --- [           main] RequestMappingHandlerAdapter            : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@2103824d: startup date

通过上面的日志,我们可以看到有一个Rejected bean name 'controller' (for URL pattern '/test.txt')的错误输出,可以为我们提供更多的信息。

综上所述,查看/调整日志级别是非常重要的定位Springboot异常的方法之一,建议开发人员在开发阶段掌握好这个技能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot启动报错时实现异常定位 - Python技术站

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

相关文章

  • oracle 10g 精简版安装步骤分享

    Oracle 10g 精简版安装步骤分享 1. 前言 Oracle是一款非常强大的数据库软件,提供了完整的企业级数据库管理解决方案。但是Oracle的安装通常的流程比较繁琐,常常需要配置多项参数,而且安装包非常大,对于有些项目和学习环境而言,精简版的Oracle已经足够使用。本教程将介绍Oracle 10g 精简版的安装步骤和常用设置,希望对初学者有所帮助。…

    database 2023年5月21日
    00
  • Redis中统计各种数据大小的方法

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/125.html?1455853369如果 MySQL 数据库比较大的话,我们很容易就能查出是哪些表占用的空间;不过如果 Redis 内存比较大的话,我们就不太容易查出是哪些(种)键占用的空间了。 有一些工具能够提供必要的帮助,比如 r…

    Redis 2023年4月13日
    00
  • MySQL中日期型单行函数代码详解

    以下是MySQL中日期型单行函数的详细攻略: 一、日期型单行函数 MySQL提供了丰富的日期型单行函数,方便用户进行日期类型数据的处理。 1.1 CURDATE()函数 该函数用于返回当前日期,格式为’YYYY-MM-DD’。 示例: SELECT CURDATE(); 结果为: +————+ | CURDATE() | +———…

    database 2023年5月22日
    00
  • Linux下服务器重启的脚本命令

    Linux下服务器重启的脚本命令一般使用Shell脚本来实现。下面是一个完整的攻略,包括如何创建脚本文件、编写脚本代码、添加权限、运行脚本以及两个示例说明。 创建脚本文件 首先,在Linux服务器上创建一个Shell脚本文件,文件名以 .sh 结尾,例如 restart.sh。 touch restart.sh # 创建一个空白的restart.sh文件 编…

    database 2023年5月22日
    00
  • idea中使用mysql的保姆级教程(超详细)

    Idea中使用MySQL的保姆级教程 在Idea中操作MySQL可能是很多新手会遇到的问题。本篇攻略将从如下几个方面介绍Idea中使用MySQL的详细步骤: 安装MySQL 配置JDBC驱动 创建数据库连接 操作数据库 示例说明 1. 安装MySQL 首先需要安装MySQL数据库。可以在MySQL官网下载并按照提示安装。 2. 配置JDBC驱动 Idea需要…

    database 2023年5月18日
    00
  • MySQL 及 SQL 注入与防范方法

    MySQL 及 SQL 注入与防范方法 在讲解 MySQL 及 SQL 注入与防范方法之前,我们先来理解一下 MySQL 和 SQL。 MySQL 是一款开源的关系型数据库管理系统,被广泛应用于 Web 应用程序开发的数据存储。SQL(Structured Query Language)是一种专门用来访问和操作关系型数据库的语言。 SQL 注入攻击是指攻击者…

    database 2023年5月22日
    00
  • redis开发使用规范

    1、冷热数据分离,不要将所有数据全部都放在Redis中     根据业务只将高频热数据存储到Redis中【QPS大于5000】,对于低频冷数据可以使用mysql等基于磁盘的存储方式。     不仅节省内存成本,而且数据量小操作时速度更快,效率更高。 2、不同的业务数据要分开存储     不要将不相关的业务数据都放到一个Redis实例中,建议新业务申请新的单独…

    Redis 2023年4月13日
    00
  • Oracle WebLogic Server 12.2.1.2安装部署教程

    Oracle WebLogic Server 12.2.1.2 安装部署教程 本文将介绍 Oracle WebLogic Server 12.2.1.2 的安装和部署过程。 准备工作 在开始安装前,您需要进行以下准备工作: 下载安装程序:从官方网站下载 WebLogic Server 12.2.1.2 的安装程序,或者从 Oracle 官方 Docker H…

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