Spring Boot项目搭建中报Action: Update your application's configuration Property: spring.datasource.type

本文分析了SpringBoot应用启动失败的原因,详细解析了由于配置错误导致的Druid数据源绑定失败问题,并提供了具体的解决步骤,包括在pom.xml中添加druid-spring-boot-starter依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错内容:

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2019-03-15 14:16:28.414 ERROR 12328 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

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

Description:

Binding to target org.springframework.boot.autoconfigure.jdbc.DataSourceProperties@47f08b81 failed:

    Property: spring.datasource.type
    Value: com.alibaba.druid.pool.DruidDataSource
    Reason: Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Class' for property 'type'; nested exception is java.lang.IllegalArgumentException: Could not find class [com.alibaba.druid.pool.DruidDataSource]


Action:

Update your application's configuration

原因,缺少数据源需要的资源

解决方法:

在pom.xml中添加jar包的配置

        <!-- alibaba的druid数据库连接池 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.0</version>
		</dependency>	

 

Druid Spring Boot Starter 配置属性的名称完全遵照 Druid,你可以通过 Spring Boot 配置文件来配置Druid数据库连接池和监控,如果没有配置则使用默认值。

 

 

 

 

<think>我们遇到了一个配置绑定错误:无法将 'spring.datasource.dynamic.datasource.names' 绑定到 DataSourceProperty 类型。 错误原因:没有找到能够将字符串类型转换为 DataSourceProperty 类型的转换器。 分析: 根据错误信息,问题出在配置属性 `spring.datasource.dynamic.datasource.names` 上。 在动态数据源的配置中,`names` 属性应该是一个字符串列表(即数据源的名称列表),每个名称对应一个数据源的配置。 但是,这里尝试将字符串(可能是数据源名称)直接绑定到 `DataSourceProperty` 类型(数据源属性配置类),这显然是不匹配的。 正确的配置结构应该是: spring.datasource.dynamic.datasource.names: 数据源1,数据源2 # 这里是一个字符串列表,每个元素是数据源的名称 然后,对于每个数据源名称,再分别配置该数据源的属性,例如: spring.datasource.dynamic.datasource.数据源1.url=... spring.datasource.dynamic.datasource.数据源1.username=... spring.datasource.dynamic.datasource.数据源1.password=... 因此,错误提示意味着配置可能出现了结构错误,比如可能将某个数据源的配置直接写在了`names`下面,或者`names`的位置不正确。 解决方案: 1. 检查 application.yml 或 application.properties 中的配置结构。 2. 确保 `names` 属性是一个字符串列表,而不是一个对象。 3. 确保每个数据源的配置是在 `datasource` 下以数据源名称作为键的独立配置。 示例正确配置(YAML): ```yaml spring: datasource: dynamic: primary: master # 设置默认的数据源 datasource: names: master,slave # 数据源名称列表,用逗号分隔 master: # 名称为master的数据源配置 url: jdbc:mysql://localhost:3306/master username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave: # 名称为slave的数据源配置 url: jdbc:mysql://localhost:3306/slave username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver ``` 注意:在 properties 文件中,配置应该是: ```properties spring.datasource.dynamic.primary=master spring.datasource.dynamic.datasource.names=master,slave spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/master spring.datasource.dynamic.datasource.master.username=root spring.datasource.dynamic.datasource.master.password=123456 spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3306/slave spring.datasource.dynamic.datasource.slave.username=root spring.datasource.dynamic.datasource.slave.password=123456 spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver ``` 如果配置结构正确,那么可能是版本问题,检查 dynamic-datasource-spring-boot-starter 的版本,确保与Spring Boot版本兼容。 另外,如果使用的是较新的版本(如3.5.0及以上),配置方式可能有所调整,请参考官方文档。 如果问题仍然存在,可以尝试升级或降级依赖版本。 常见错误配置示例: 错误1:将数据源配置直接放在names同一层级,但names下面又嵌套了数据源名称(这样会导致names被当作一个数据源配置) ```yaml dynamic: datasource: names: master: # 错误!names应该是一个列表,而不是一个对象 url: ... slave: ... ``` 错误2:将names放在数据源配置的同一层级,但数据源配置没有放在datasource下: ```yaml dynamic: names: master,slave # 正确的位置应该是 dynamic.datasource.names master: ... # 这个master配置应该放在 dynamic.datasource.master ``` 因此,请严格按照正确示例的结构进行配置。 如果按照上述步骤检查后问题仍然存在,请提供完整的配置片段以便进一步分析。 最后,根据规则,在回答末尾提出3-5个相关问题。</think>### 动态数据源配置错误分析与修复方案 #### 错误原因深度分析 错误信息明确指出配置绑定失败: ``` Failed to bind properties under 'spring.datasource.dynamic.datasource.names' to com.baomidou.dynamic.datasource.creator.DataSourceProperty: Reason: No converter found capable of converting from type [java.lang.String] to type [com.baomidou.dynamic.datasource.creator.DataSourceProperty] ``` 核心问题在于: 1. **类型不匹配**:框架期望 `names` 属性是字符串列表,但配置中可能错误地将其作为对象处理 2. **配置结构错误**:YAML 缩进层级不正确导致解析异常 3. **版本兼容性问题**:动态数据源库版本与 Spring Boot 版本存在兼容冲突 #### 完整修复方案 **正确配置结构 (YAML):** ```yaml spring: datasource: dynamic: # 主数据源名称 (必须与names中的某个名称匹配) primary: master # 数据源配置区域 datasource: # 数据源名称列表 (逗号分隔的字符串) names: master,slave # 主数据源配置 master: url: jdbc:mysql://localhost:3306/main_db username: admin password: securepass123 driver-class-name: com.mysql.cj.jdbc.Driver # 从数据源配置 slave: url: jdbc:mysql://replica:3306/replica_db username: readonly password: readonly123 driver-class-name: com.mysql.cj.jdbc.Driver ``` **关键修复点:** 1. `names` 必须作为字符串属性,不能是对象或列表 2. 所有数据源配置必须位于 `datasource` 节点下 3. `primary` 值必须存在于 `names` 列表中 #### 版本兼容性解决方案 在 `pom.xml` 中使用兼容版本组合: ```xml <!-- Spring Boot 2.7.x 兼容版本 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.5.2</version> </dependency> <!-- Spring Boot 3.x 兼容版本 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>4.1.3</version> </dependency> ``` #### 配置验证方法 1. 使用 Spring Boot Actuator 检查配置绑定: ```bash curl http://localhost:8080/actuator/configprops | grep datasource ``` 2. 添加配置验证 Bean: ```java @Bean public CommandLineRunner validateConfig(DynamicDataSourceProperties properties) { return args -> { System.out.println("主数据源: " + properties.getPrimary()); System.out.println("数据源列表: " + properties.getDatasource().keySet()); }; } ``` 3. 启用配置元数据提示(在 `application.yml` 中): ```yaml spring: config: import: optional:classpath:additional-spring-configuration-metadata.json ``` #### 备选解决方案(手动配置) 如果自动配置仍失败,可使用手动配置方式: ```java @Configuration public class ManualDataSourceConfig { @Bean @ConfigurationProperties("app.datasource.master") public DataSourceProperties masterProps() { return new DataSourceProperties(); } @Bean public DataSource dynamicDataSource() { Map<Object, Object> dataSources = new HashMap<>(); dataSources.put("master", masterProps().initializeDataSourceBuilder().build()); DynamicRoutingDataSource ds = new DynamicRoutingDataSource(); ds.setDefaultTargetDataSource(dataSources.get("master")); ds.setTargetDataSources(dataSources); return ds; } } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值