Spring Boot错误 - 在创建类路径资源DataSourceAutoConfiguration中定义的名称为'dataSource'的bean时出错

243 阅读4分钟

大家好,如果你在使用Spring Boot,并得到诸如 "无法确定数据库类型NONE的嵌入式数据库驱动类 "或 "在类路径资源ataSourceAutoConfiguration中定义的名称为'dataSource'的bean创建错误 "等错误,那么你就来对地方了。在这篇文章中,我们将研究出现这种Spring Boot错误的不同情况,以及你可以如何解决这些问题。这个错误的一般原因是Spring Boot的自动配置,它试图为你自动配置一个DataSource,但没有足够的信息。它正在自动尝试创建一个DataSourceAutoConfigurationBean的实例,但却失败了。

像其他Spring框架的错误一样,堆栈跟踪看起来相当混乱,这一点他们可以通过Spring Boot来改进,但最重要的是这里有我上面提到的两个错误。

让我们看看堆栈跟踪的总体情况:

org.springframework.beans.factory.BeanDefinitionStoreException。工厂方法[public javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource()]引发了异常;嵌套异常是org.springframework.beans.factory.BeanCreationException。无法为数据库类型NONE确定嵌入式数据库驱动类。如果你想要一个嵌入式数据库,请在classpath上放置一个支持的数据库。:
[INFO] org.springframework.beans.factory.BeanCreationException。无法为数据库类型NONE确定嵌入式数据库驱动类。如果你想要一个嵌入式数据库,请在classpath上放置一个支持的数据库。

Btw,如果你是完全陌生的Spring框架,这些错误可能会让你感到害怕。在这种情况下,我建议你通过一个全面的Spring Boot课程,比如Udemy上Dan Vega的《学习Spring Boot》。 现在,让我们看看这个错误的一些常见原因,以及你可以做什么来解决这个问题。

1.由于启动器的依赖性,Spring Boot出现错误

我的一些朋友和读者得到了这个错误,即使他们不需要数据库。他们得到这个错误的主要原因是启动器的依赖性,比如有些人包含了spring-boot-starter-data-jpa,然后包含了hibernate-entitymanager.jar,他们没有额外的东西需要设置。

有时,包括不正确的启动程序POM也可以解决这个问题,比如添加spring-boot-starter-jdbc而不是spring-boot-starter-data-jpa的依赖。

如果你知道,Spring Boot的自动配置是由classpath中的JAR依赖项触发的,如果它拉出了你不需要的东西,那么就会出现这种错误。

这就是为什么需要对Spring基础知识有充分的了解才能正确使用Spring Boot。如

2.由于缺少依赖关系

有时你确实需要一个数据库,但你忘了把驱动JAR文件纳入classpath,这也会导致这个错误。例如,你在application.properties、spring boots配置文件中指定了以下属性,但没有将相应的MySQL JDBC驱动程序纳入classpath

spring.datasource.url = jdbc:mysql://localhost/test
spring.datasource.driver-class-name= com.mysql.jdbc.Driver

为了解决这个错误,要么你需要纳入正确的Starter POM依赖,要么手动将MySQL JDBC JAR文件纳入classpath。

3.由于Application.properties中缺少配置

Spring Boot擅长配置内存数据库,如H2、HSQLDB、Derby等,它只需将它们的JAR文件添加到classpath中即可配置,但对于其他数据库,你需要给Spring Boot提供额外的细节,如URL、DriverClass名称等。

你可以通过在application.properties文件中添加一些带有spring.datasource前缀的属性来实现,如下例所示:

spring.datasource.url = jdbc:mysql://localhost/abc
spring.datasource.name=testme
spring.datasource.username=xxxx
spring.datasource.password=xxxx
spring.datasource.driver-class-name= com.mysql.jdbc.Driver spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MyDialect

这将提供Spring Boot自动配置组件来为你配置数据库。

4.排除DataSourceAutoConfiguration

有时排除DataSourceAutoConfigution也可以解决这个问题,尤其是在你不需要数据库的时候。这将防止Spring Boot自动配置数据库,而且不会出现任何错误。你可以通过使用Spring Boot的@EnableAutoConfiguration注解的exclude Attribute来禁用某些类的自动配置,如下图所示。

@Configuration
@EnableAutoConfiguration

你甚至可以使用@EnableAutoConfiguration的exclude属性来排除多个类,如下图所示。

@Configuration
@EnableAutoConfiguration

以上就是关于 "如何解决 "无法确定数据库类型NONE的嵌入式数据库驱动类 "或"创建类路径资源DataSourceAutoConfiguration中定义的名称为'dataSource'的bean错误 "的问题。在大多数情况下,这是因为自动配置没有足够的细节来配置数据库,但有时也会意外地触发数据库自动配置,可以使用@EnableAutoConfiguration注解的exclude属性来禁用。