1. 概述

在本篇短文中,我们将探讨 Spring Boot 项目中出现 “Failed to configure a DataSource” 错误的原因及解决方案

我们将通过两种不同的方式来处理这个问题:

  1. 明确定义数据源
  2. 禁用自动配置数据源功能

2. 问题描述

假设我们有一个 Spring Boot 项目,并且我们在 pom.xml 中添加了 spring-boot-starter-data-jpaMySQL JDBC 驱动 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

当我们运行应用时,却抛出了如下错误:

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

那么为什么会发生这种情况呢?

3. 原因分析

Spring Boot 的设计原则是:根据类路径中的依赖自动配置相应的 Bean。

由于我们引入了 JPA 相关的依赖,Spring Boot 尝试自动配置一个 JPA 数据源(DataSource)。但问题是:我们并没有提供它所需的信息来完成这个配置过程。

例如,我们没有定义任何 JDBC 连接属性。当我们使用外部数据库如 MySQL 或 MSSQL 时,这些信息是必须的。而如果我们使用的是 H2 这类内存数据库,则不会遇到这个问题,因为它们可以自动创建数据源而无需额外配置。

✅ 所以,总结一句话:缺了数据库连接信息,Spring Boot 不知道怎么给你配数据源。

4. 解决方案

4.1. 使用配置文件定义数据源

最直接的办法就是通过配置文件提供数据库连接信息

首先,在项目的 application.properties 文件中添加以下内容:

spring.datasource.url=jdbc:mysql://localhost:3306/myDb
spring.datasource.username=user1
spring.datasource.password=pass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

或者,也可以使用 application.yml 格式:

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/myDb
    username: user1
    password: pass

✅ 设置完这些属性后,Spring Boot 就能正确地配置出一个数据源了。

4.2. 以编程方式定义数据源

除了使用配置文件,我们还可以通过代码的方式来定义数据源。

使用 Spring 提供的 DataSourceBuilder 工具类即可轻松实现:

@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource getDataSource() {
        return DataSourceBuilder.create()
          .driverClassName("com.mysql.cj.jdbc.Driver")
          .url("jdbc:mysql://localhost:3306/myDb")
          .username("user1")
          .password("pass")
          .build();    
    }
}

这种方式适合需要更灵活控制数据源初始化逻辑的场景。

⚠️ 注意:上面两种方法都可以解决数据源配置问题,选择哪一种取决于你的具体需求。

4.3. 禁用数据源的自动配置

如果暂时还不想配置数据源怎么办?我们可以告诉 Spring Boot:别自动配置数据源了!

Spring Boot 中负责数据源自动配置的核心类是 DataSourceAutoConfiguration

我们可以通过以下几种方式禁用它:

方法一:在 application.properties 中排除

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

方法二:在 application.yml 中排除

spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

方法三:使用注解方式排除

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

✅ 以上三种方式都能达到目的:禁止 Spring Boot 自动配置数据源,同时不影响其他组件的自动配置。

💡 建议:如果你只是临时不想配置数据源(比如做单元测试),可以用这种方式绕过;但如果最终要用到数据库,还是老老实实配上吧。

5. 总结

本文我们分析了 Spring Boot 中出现 “Failed to configure a DataSource” 错误的根本原因,并提供了两个主要解决方案:

  • ✅ 通过配置文件或编程方式明确定义数据源
  • ⚠️ 或者禁用数据源的自动配置机制

一般来说,推荐优先提供数据源信息,而不是简单粗暴地关掉自动配置。特别是在生产环境中,正确的数据库连接配置是必不可少的。

一如既往,本文所涉及的完整代码示例可从 GitHub 获取。


原始标题:Resolving Failed to Configure a DataSource Error | Baeldung