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

当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日

相关文章

  • MySql常用数据类型与操作详解

    MySql常用数据类型与操作详解 数据类型 数值类型 MySQL中常见的数值类型有TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、FLOAT、DOUBLE等。具体特点如下: TINYINT:有符号范围为-128~127,无符号范围为0~255。 SMALLINT:有符号范围为-32768~32767,无符号范围为0~65535。 …

    database 2023年5月22日
    00
  • Windows系统下Node.js的简单入门教程

    非常感谢您对Windows系统下Node.js的简单入门教程感兴趣。下面是本攻略的完整步骤: 1. 安装Node.js环境 首先,您需要到官网下载Node.js的安装包,并进行安装。安装完成后,通过在命令行中输入以下命令,可以检查Node.js是否安装成功: node -v 该命令将会输出您当前安装的Node.js版本号,如果未输出版本号,说明Node.js…

    database 2023年5月22日
    00
  • MySQL中Union子句不支持order by的解决方法

    MySQL中的UNION子句是用来合并两个或多个SELECT语句的结果集,可以实现对多个表或视图的查询结果进行合并、去重、排序等操作。然而,使用UNION时无法直接按照特定的列进行排序,因为UNION会将所有结果混合在一起,而不是针对单个SELECT结果进行排序。因此,我们需要借助一些技巧来实现UNION后的排序操作。 下面是一些解决MySQL中UNION子…

    database 2023年5月22日
    00
  • Ubuntu18.04安装mysql5.7.23的教程

    下面是“Ubuntu18.04安装mysql5.7.23的教程”的完整攻略: 确认Ubuntu18.04系统 首先,确认你正在使用的Ubuntu的版本为Ubuntu18.04。在终端中执行以下命令: lsb_release -a 如果你的Ubuntu系统版本确实是18.04,那么你可以开始安装mysql: 安装mysql 步骤1:更新apt 在安装任何软件之…

    database 2023年5月22日
    00
  • 通过MySQL优化Discuz!的热帖翻页的技巧

    通过MySQL优化Discuz!热帖翻页的技巧可以显著提高网站访问速度和用户体验。下面是一些可能的优化技巧: 1. 合理设置MySQL的缓存 Discuz!使用MySQL作为后台数据库,可以通过调整MySQL的缓存策略来优化翻页性能。具体方法包括: 适当增加query_cache_size参数的值,以缓存查询结果。 设置key_buffer_size参数的值…

    database 2023年5月22日
    00
  • mysql中inner join和left join如何使用

    这篇文章主要介绍“mysql中inner join和left join如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql中inner join和left join如何使用”文章能帮助大家解决问题。 区别 返回不同1、inner join只返回两个表中联结字段相等的行2、left join的数量小于等于左…

    MySQL 2023年4月8日
    00
  • springboot mybatis调用多个数据源引发的错误问题

    针对“springboot mybatis调用多个数据源引发的错误问题”,我可以提供如下的攻略过程: 问题背景 在使用SpringBoot和Mybatis框架进行数据源操作时,可能会遇到需要多个数据源的情况,比如:读取或写入的数据源不同,或者需要连接不同的数据库等情况。在这种情况下,我们需要自定义DataSource,同时配置多个SqlSessionFact…

    database 2023年5月18日
    00
  • Nginx中防止SQL注入攻击的相关配置介绍

    Nginx虽然是一款Web服务器,但它也能够作为反向代理和负载均衡器,因此有必要对其进行SQL注入攻击防范措施的配置。 防止SQL注入攻击的配置介绍 1. 开启Nginx的ModSecurity模块 ModSecurity是一个Web应用程序防火墙(WAF)模块,能够检测和防御SQL注入攻击等Web攻击。在Nginx中,要使用ModSecurity模块,需要…

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