技术填坑系列:java.lang.IllegalStateException: Failed to load ApplicationContext

总所周知,spring boot的启动错误可以很大程度上依赖于spring boot本身提供的错误信息来定位

就比如下面这个错误:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-05-27 11:43:14.085 ERROR 40352 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'spring.datasource' to javax.sql.DataSource:

    Property: spring.datasource.filters
    Value: stat,wall,log4j
    Origin: class path resource [application.yml]:21:14
    Reason: org.apache.log4j.Priority

Action:

Update your application's configuration

java.lang.IllegalStateException: Failed to load ApplicationContext

它都挑明了Property、Value、Origin、Reason
甚至都还给出了Action:Update your application’s configuration
大致的意思就是在application.yml这个配置文件中,spring.datasource.filters这个属性获取到了stat,wall,log4j这些值,其中org.apache.log4j.Priority有问题。
那问题其实就已经很明确了:log4j
在这可以看到这个注释也是尝试之一,但它并不是问题的关键

@Configuration
//@EnableConfigurationProperties
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druid(){
        return new DruidDataSource();
    }

}

那直接用Diagrams -> Show Dependencies,当然你也可以用快捷键:Ctrl+Alt+Shift+U
pom文件查看依赖图的截图.jpg

找到日志框架的部分,这里就可以看到:
日志框架相关依赖图的截图.jpg
既然问题已经定位到日志框架上,那解决思路就有两个:

  1. 要么添加log4j的日志框架;
  2. 要么把log4j改成已有的日志框架(log4j2、slf4j)

那首先就试试添加log4j的框架:

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>

看看运行结果:
log4j有WARN的截图.jpg

这是啥?原来是缺少log4j的配置文件,好吧我搞一个。。。

log4j:WARN No appenders could be found for logger (druid.sql.Connection).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

那我就在classpath下添加一个文件名叫log4j.properties的文件,并写入以下内容:

### set log levels ###
log4j.rootLogger = debug ,  stdout# ,  D ,  E

### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %m%n

#### 输出到日志文件 ###
#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.D.File = logs/log.log
#log4j.appender.D.Append = true
#log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志
#log4j.appender.D.layout = org.apache.log4j.PatternLayout
#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
#
#### 保存异常信息到单独文件 ###
#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.D.File = logs/error.log ## 异常日志文件名
#log4j.appender.D.Append = true
#log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!
#log4j.appender.D.layout = org.apache.log4j.PatternLayout
#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

修改log4j配置文件的截图.jpg

以上,这是第一种解决方式:添加log4j日志框架

那么接下来,试一下第二的方式,把spring.datasource.filters中的log4j改为log4j2或者slf4j

spring:
  datasource:
	filters: stat,wall,log4j2
spring:
  datasource:
	filters: stat,wall,slf4j

注意: 记得把pom.xml中的log4j依赖移除/注释掉

下面是运行结果:
问题解决的截图.jpg

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值