Spring boot项目启动自动加载mongo配置失败导致启动失败问题

总结一下在一次spring boot 项目启动中遇到的问题,主要原因是启动时提示在加载dataSource defined in class path resource org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class时失败。

该项目是一个网关项目,只配置了一个redis数据源,且最近一段时间未改动过任何配置(环境配置、pom均为改动)。所以突然出现启动失败,感觉很困惑!开始怀疑测试环境问题(测试环境使用的docker,不是很稳定)后来本地启动、预发环境启动master分支同样问题,排除docker环境因素!

仔细看日志,加载dataSource报连接mongodb失败,也就是spring boot在启动时去加载dataSource,然后从配置文件中去加载连接mongodb的配置没有找到,导致连接失败。

2020-04-10 09:47:47,567 [localhost-startStop-1] INFO  org.springframework.web.context.ContextLoader   - Root WebApplicationContext: initialization completed in 3576 ms
2020-04-10 09:47:48,107 [localhost-startStop-1] INFO  org.mongodb.driver.cluster   - Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
2020-04-10 09:47:48,129 [cluster-ClusterId{value='5e8fd0441919428f62237562', description='null'}-localhost:27017] INFO  org.mongodb.driver.cluster  com.mongodb.MongoSocketOpenException: Exception opening socket
	at com.mongodb.connection.SocketStream.open(SocketStream.java:62)
	at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
	at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:59)
	at com.mongodb.connection.SocketStream.open(SocketStream.java:57)
	... 3 common frames omitted
 - Exception in monitor thread while connecting to server localhost:27017
2020-04-10 09:47:48,396 [localhost-startStop-1] ERROR org.springframework.boot.web.embedded.tomcat.TomcatStarter   - Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException. Message: Error creating bean with name 'servletEndpointRegistrar' defined in class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar]: Factory method 'servletEndpointRegistrar' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'healthEndpoint' defined in class path resource [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.health.HealthEndpoint]: Factory method 'healthEndpoint' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthIndicatorAutoConfiguration': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthIndicatorAutoConfiguration$$EnhancerBySpringCGLIB$$ad1b39b4]: Constructor threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class
2020-04-10 09:47:48,410 [main] INFO  org.apache.catalina.core.StandardService   - Stopping service [Tomcat]

因为清楚该项目不需要配置mongodb连接,所以我们可以屏蔽mongodb的加载,具体做法在Spring boot 启动类Application的注解@SpringBootAppliation(exclude = { MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}),然后重新编译启动,发现依然失败!但是问题异常信息变了,日志如下:

2020-04-10 10:19:55,390 [localhost-startStop-1] ERROR org.springframework.boot.web.embedded.tomcat.TomcatStarter   - Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException. Message: Error creating bean with name 'servletEndpointRegistrar' defined in class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar]: Factory method 'servletEndpointRegistrar' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'healthEndpoint' defined in class path resource [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.health.HealthEndpoint]: Factory method 'healthEndpoint' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthIndicatorAutoConfiguration': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthIndicatorAutoConfiguration$$EnhancerBySpringCGLIB$$b3ab18de]: Constructor threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class
2020-04-10 10:19:55,406 [main] INFO  org.apache.catalina.core.StandardService   - Stopping service [Tomcat]
2020-04-10 10:19:55,415 [main] WARN  o.s.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext   - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
2020-04-10 10:19:55,426 [main] INFO  o.s.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener   - 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-04-10 10:19:55,432 [main] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter   - 

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

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
	If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
	If you have database settings to be loaded from a particular profile you may need to activate it (the profiles dev are currently active).

这次没有提示加载mongodb连接失败,但是仍然提示加载dataSource失败,也就是说dataSource在启动时仍然在加载,那我们继续排除,在启动类中加入DataSourceAutoConfiguration.class,然后启动,这次正常了!

总结:由于项目中 有部分依赖外部的版本是SNAPSHOT版,存在外部发不了不稳定的版本,导致项目启动失败。完整配置如下:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class ,MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})

 

 

 

 

 

 

 

你可能感兴趣的:(Spring,boot)