原因
根据设计,Spring Boot 自动配置尝试根据添加到类路径的依赖项自动配置 bean。
由于我们的类路径有 JPA 依赖,Spring Boot 会尝试自动配置 JPA DataSource。问题是我们没有向 Spring 提供执行自动配置所需的信息。
例如,我们尚未定义任何 JDBC 连接属性,但在使用 MySQL 和 MSSQL 等外部数据库时需要这样做。另一方面,对于 H2 等内存数据库,我们不会遇到这个问题,因为它们可以在没有所有这些信息的情况下创建数据源。
解决方案
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
2. 以编程方式定义数据源
或者,我们可以使用实用程序构建器类DataSourceBuilder以编程方式定义数据源。
我们需要提供数据库 URL、用户名、密码和 SQL 驱动程序信息来创建数据源:
@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();
}
}
简而言之,我们可以选择使用上述任一选项来根据我们的要求配置数据源。
3. 排除数据源自动配置
在上一节中,我们通过将数据源属性添加到项目中解决了该问题。
但是,如果我们还没有准备好定义数据源,我们该如何解决这个问题呢?让我们看看如何阻止 Spring Boot 自动配置数据源。
DataSourceAutoConfiguration类是使用spring.datasource.*属性配置数据源的基类。
现在,我们可以通过几种方法将其从自动配置中排除。
首先,我们可以使用application.properties文件中的spring.autoconfigure.exclude属性禁用自动配置 :
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
我们可以使用application.yml文件执行相同的操作:
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
复制或者我们可以在@SpringBootApplication或@EnableAutoConfiguration注释上使用排除属性:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
在上面的所有示例中,我们禁用了DataSource的自动配置。这不会影响任何其他 bean 的自动配置。