SpringBoot启动报错:DataSource配置失败,Nacos数据源已配置仍异常
SpringBoot集成Druid、Nacos、MyBatis启动报错排查
报错日志
2024-10-05 15:56:41.577 |main |INFO |org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener:136 | Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2024-10-05 15:56:41.725 |main |ERROR |org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter:40 | *************************** 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).
报错提示未指定DataSource的url属性且无法配置嵌入式数据源,原因是无法确定合适的驱动类。已确认Nacos中的动态数据源配置完整,但启动仍异常,以下是相关代码及排查方向:
启动类代码
@SpringBootApplication(scanBasePackages = {"com.xx"}) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX,pattern = "com.xx.generator.*")}) @Slf4j @EnableFeignClients @EnableDiscoveryClient @EnableScheduling @EnableAsync public class PublishApplication { public static void main(String[] args) { SpringApplication.run(PublishApplication.class,args); } }
本地启动配置
spring.cloud.nacos.config.file-extension=properties spring.config.import=optional:nacos:mini-publish-server,optional:nacos:es,optional:nacos:redis,optional:nacos:public,optional:nacos:sa-token spring.cloud.nacos.config.server-addr=172.16.102.25:8847,172.16.102.26:8847,172.16.102.27:8847 spring.cloud.nacos.config.username=nacos spring.cloud.nacos.config.password=77tLQHAccDZZjWF spring.cloud.nacos.config.namespace=ynhhz-mini-media-platform spring.cloud.nacos.discovery.file-extension=properties spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=77tLQHAccDZZjWF spring.cloud.nacos.discovery.server-addr=172.16.102.25:8847,172.16.102.26:8847,172.16.102.27:8847 spring.cloud.nacos.discovery.namespace=ynhhz-mini-media-platform
Nacos数据源配置
spring.datasource.druid.web-stat-filter.enabled=false spring.datasource.druid.stat-view-servlet.enabled=false spring.datasource.druid.stat-view-servlet.allow= spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* spring.datasource.druid.stat-view-servlet.login-username=druid spring.datasource.druid.stat-view-servlet.login-password=1aG%3dP#94v spring.datasource.druid.filter.stat.enabled=true spring.datasource.druid.filter.stat.log-slow-sql=true spring.datasource.druid.filter.stat.slow-sql-millis=100 spring.datasource.druid.filter.stat.merge-sql=true spring.datasource.druid.filter.wall.config.multi-statement-allow=true spring.datasource.dynamic.druid.initial-size=5 spring.datasource.dynamic.druid.min-idle=5 spring.datasource.dynamic.druid.max-active=20 spring.datasource.dynamic.druid.max-wait=600000 spring.datasource.dynamic.druid.time-between-eviction-runs-millis=60000 spring.datasource.dynamic.druid.min-evictable-idle-time-millis=300000 spring.datasource.dynamic.druid.max-evictable-idle-time-millis=900000 spring.datasource.dynamic.druid.validation-query=SELECT 1 FROM DUAL spring.datasource.dynamic.druid.test-while-idle=true spring.datasource.dynamic.druid.test-on-borrow=false spring.datasource.dynamic.druid.test-on-return=false spring.datasource.dynamic.primary=master spring.datasource.dynamic.datasource.master.username=sprint01 spring.datasource.dynamic.datasource.master.password=Sprint02@mysql spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.dynamic.datasource.master.url=jdbc:mysql://172.16.102.25:3306/ynhhz_mini_media_platform?useSSL=false&serverTimezone=Asia/Shanghai
问题原因及解决办法
1. 排除默认数据源自动配置
Spring Boot默认的数据源自动配置会在Nacos配置拉取前执行,导致读取不到动态数据源配置。修改启动类,排除相关自动配置类:
@SpringBootApplication( scanBasePackages = {"com.xx"}, exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class} ) // 其他注解保持不变 public class PublishApplication { // ... }
2. 检查动态数据源依赖
确保项目中引入了dynamic-datasource-spring-boot-starter依赖,而非仅Druid依赖,该starter负责解析spring.datasource.dynamic前缀的配置:
<!-- Maven依赖示例 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.6.1</version> </dependency>
3. 确认Nacos配置是否加载成功
- 移除
spring.config.import中的optional:前缀,这样如果Nacos配置拉取失败会直接报错,便于排查配置拉取问题:spring.config.import=nacos:mini-publish-server,nacos:es,nacos:redis,nacos:public,nacos:sa-token - 开启debug日志,启动时观察Nacos配置拉取日志,确认
spring.datasource.dynamic.datasource.master.url等配置是否被正确加载。
4. 验证Nacos配置归属
确认Nacos中的数据源配置是否在指定的ynhhz-mini-media-platform命名空间下,且对应的dataId是mini-publish-server(与spring.config.import中的配置一致)。如果数据源配置在其他dataId中,需要将其添加到spring.config.import列表。
内容的提问来源于stack exchange,提问作者Chuangbo Li
相关产品推荐
相关产品推荐

