当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技术站