使用springcloud启动服务时报错 Reason: Unable to set value for property driver-class-name

本文主要描述了在使用SpringCloud启动服务时遇到的问题,即SpringBoot无法设置数据源的driver-class-name。问题分析了可能是YML配置错误或者版本不兼容导致。解决方案包括检查并更新SpringBoot启动器版本,以及通过修改@SpringBootApplication注解避免自动加载数据源。

目录

问题展示

问题剖析

解决方案


 

问题展示

 

首先,此问题出现在springcloud某一个微服务启动时, 弹出的错误如下

很明显可以看出springboot启动时加载不到我们给他配置的数据源,我第一个反应是yml文件配置写错了。下面是这个微服务的yml文件,我今天反复看了好多次也没发现问题

server:
  port: 8081
spring:
  application:
    name: item-service
  datasource:
    url: jdbc:mysql:///leyou
    username: root
    password: root
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka
  instance:
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 15
mybatis:
  type-aliases-package: com.leyou.item.pojo

 

事实上,我的yml文件并没有问题 

 

问题剖析

 

原因是启动微服务时,application应用会调用@SpringBootApplication这个注解,这个注解做的其中一件事是自动加载数据源,首先确保yml文件没有写错。以下两种情况时,最可能引起这个错误

  • 你的yml文件里有多个数据源,springboot不知道该调用哪个,所以找不到
  • 逐层调用数据库时某一层的jar包版本和其他层的maven版本不兼容

很明显我的问题是第二种情况。这里对版本兼容提供一个简单的思路,mysql数据库在本地,项目启动首先要有jdbc的jar包,mysql驱动的jar包,以及对应的以下mabatis,mapper,druid的各种jar包版本。

上图中的版本都没有错误,但是有一个版本我写的和mysql的其他版本不兼容,导致springboot找不到数据源。你想到了还剩哪个版本吗?

 

解决方案

 

第一种

对,就是整个springboot工程启动器的jar包版本,这个jar包的版本和其他版本不匹配就没法调用mysql服务。如图,我之前写的版本是2.0.1,当我改成2.0.6之后项目启动成功了

ps:springcloud项目中spring-boot-starter-parent这个jar包一般都是在父工程里的哦

 

第二种

spingboot默认会自动找数据源,当我们的springboot启动器版本找不到数据源时,我们干脆就不让他自己找,跳过这一步,直接让springboot启动器的上一步找到yml文件中的数据库配置信息,这种方式只需要在这个微服务项目的application.class文件的@SpringBootApplication注解上加一个限制条件即可,不让他自动扫描数据源

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})

项目也可以正常启动

 

<think>我们正在解决Spring Boot应用中配置Oracle数据源出现的错误:`Failed to bind properties under 'oracle.datasource' to javax.sql.DataSource: Property driver-class-name oracle.jdbc.OracleDriver error in application.properties`。根据引用内容,我们注意到类似的问题通常与驱动类名、依赖版本或配置属性有关。 步骤1:检查驱动类名是否正确 在Spring Boot中,配置数据源驱动类名的属性是`spring.datasource.driver-class-name`。这里错误信息中提到的属性是`oracle.datasource`,这可能是自定义的属性前缀。我们需要确认配置文件中是否使用了正确的属性前缀和驱动类名。 正确的Oracle驱动类名是`oracle.jdbc.OracleDriver`(注意大小写)。请检查`application.properties`或`application.yml`中的配置: 例如,在`application.properties`中: ``` # 如果使用标准Spring数据源配置 spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.url=jdbc:oracle:thin:@//host:port/service spring.datasource.username=your_username spring.datasource.password=your_password ``` 或者,如果你使用了自定义前缀(如`oracle.datasource`),那么配置可能是: ``` oracle.datasource.driver-class-name=oracle.jdbc.OracleDriver oracle.datasource.url=jdbc:oracle:thin:@//host:port/service oracle.datasource.username=your_username oracle.datasource.password=your_password ``` 但是,请注意,如果使用自定义前缀,你需要在配置类中使用`@ConfigurationProperties`注解来绑定这些属性。例如: ```java @Configuration @ConfigurationProperties(prefix = "oracle.datasource") public class OracleDataSourceConfig { private String driverClassName; private String url; private String username; private String password; // 省略getter和setter } ``` 步骤2:检查Oracle JDBC驱动依赖 确保在`pom.xml`中包含了Oracle JDBC驱动的依赖。由于Oracle的JDBC驱动不在Maven中央仓库,你可能需要手动添加到本地仓库,或者使用已经配置好的仓库。 添加依赖示例(注意:版本号需要根据你的Oracle数据库版本选择): ```xml <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>21.5.0.0</version> <scope>runtime</scope> </dependency> ``` 或者,如果你使用的是较旧的Oracle版本(如11g),可以使用: ```xml <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.4</version> <scope>runtime</scope> </dependency> ``` 注意:从12c开始,Oracle官方推荐使用`ojdbc8`。 步骤3:检查依赖冲突 如果项目中存在多个数据源相关的依赖(比如同有HikariCP、Tomcat JDBC、DBCP等),可能会引起冲突。确保只引入一个数据源实现。Spring Boot默认使用HikariCP。 如果你要使用Druid数据源,需要排除默认的HikariCP,并引入Druid依赖(参考引用[5]): ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> ``` 步骤4:检查日志框架冲突(参考引用[3]) 如果使用了Druid并且配置了filters(如log4j),请注意日志框架的版本兼容性。在Spring Boot 2.x中,默认使用Logback,如果使用Log4j,需要排除Logback并引入Log4j2。但根据引用[3],在Druid配置中如果使用log4j作为filter,在Spring Boot 2.x中可能会因为缺少log4j的依赖而报错。解决方案是: - 升级Druid版本(新版本可能已经解决) - 或者,在配置中移除log4j的filter(如果不需要) - 或者,添加log4j的依赖(不推荐,因为Spring Boot 2.x默认支持Log4j2) 步骤5:检查属性绑定问题 错误信息中提到了绑定属性失败,可能是配置的属性名与目标类的属性不匹配。确保配置文件中的属性名与`@ConfigurationProperties`类中的属性名一致(支持驼峰命名和短横线分隔)。 例如,在配置类中有一个`driverClassName`属性,那么在配置文件中可以是`driver-class-name`或`driverClassName`。 总结解决方案: 1. 确认驱动类名正确,且配置属性前缀正确。 2. 添加正确的Oracle JDBC驱动依赖。 3. 如果使用了Druid,确保引入Druid依赖并排除默认数据源(如果需要)。 4. 检查日志依赖,避免因日志框架缺失导致的错误。 5. 检查属性绑定,确保属性名匹配。 如果问题仍然存在,请提供更多的配置信息(如application.properties或application.yml的内容)和完整的错误堆栈。 相关问题: 1. 如何在Spring Boot中配置多个数据源? 2. 如何解决Druid数据源监控页面无法访问的问题? 3. Spring Boot中如何切换不同的数据库连接池(如HikariCP, Tomcat JDBC, Druid)?</think>### 解决Oracle数据源配置错误 以下是针对错误 `Failed to bind properties under 'oracle.datasource' to javax.sql.DataSource: Property driver-class-name oracle.jdbc.OracleDriver error` 的完整解决方案: #### 1. **检查驱动类名拼写** - **问题**:`driver-class-name` 属性值拼写错误 - **正确配置**: ```properties # application.properties oracle.datasource.driver-class-name=oracle.jdbc.OracleDriver ``` - 注意:`OracleDriver` 的 `O` 和 `D` 必须大写,不能写成 `oracledriver` 或 `OracleDriver`[^1][^5]。 #### 2. **添加Oracle JDBC依赖** - 在 `pom.xml` 中添加官方驱动: ```xml <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>21.5.0.0</version> </dependency> ``` - **重要**:避免使用非官方依赖(如 `com.oracle` 开头的旧版)[^4][^5]。 #### 3. **验证依赖作用域** - 确保依赖未错误限定为 `runtime`: ```xml <!-- 错误示例 --> <scope>runtime</scope> <!-- 删除此行 --> ``` - 驱动类必须在编译期可用[^1][^4]。 #### 4. **检查配置前缀一致性** - Java 配置类需匹配属性前缀: ```java @Configuration @ConfigurationProperties(prefix = "oracle.datasource") // 必须与properties前缀一致 public class OracleConfig { private String driverClassName; // getter/setter } ``` - 前缀不一致会导致绑定失败[^2][^3]。 #### 5. **完整配置示例** ```properties # application.properties oracle.datasource.url=jdbc:oracle:thin:@//localhost:1521/ORCLCDB oracle.datasource.username=system oracle.datasource.password=your_password oracle.datasource.driver-class-name=oracle.jdbc.OracleDriver ``` #### 6. **解决冲突依赖** - 检查是否同存在多个数据源依赖: ```xml <!-- 保留一个即可 --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <!-- 默认连接池 --> </dependency> ``` - 冲突会导致类加载失败[^1][^5]。 --- ### 根本原因分析 该错误通常由以下原因导致: 1. 驱动类名拼写错误(大小写敏感) 2. 缺少 Oracle JDBC 依赖或版本不兼容 3. 属性前缀与 `@ConfigurationProperties` 不匹配 4. 依赖作用域限制(如 `runtime`) 5. 连接池配置冲突(如同启用 HikariCP 和 Druid) 通过上述步骤排查后,数据源绑定问题通常可解决。若仍报错,请检查 Oracle 服务状态和网络连接[^1][^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值