如何解决 Spring 应用程序中的数据源错误?

How to resolve DataSource Error in Spring Application?

我 运行 进入“无法为 属性 驱动程序-class-名称设置值”(有关完整的错误详细信息,请参阅最后一段)。我已经阅读了其他几篇关于 SO 的文章,它们似乎暗示我已经正确设置了这个,但我不知道我遗漏了什么,所以我提前道歉,因为使用属性文件对我来说是新的。是什么导致了这个错误?

application.properties:

# MySQL
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/cafe?useTimezone=true&serverTimezone=UTC
db.user=root
db.password=root

pom.xml:

...
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
    <scope>runtime</scope>
</dependency>

数据源配置:

@Configuration
@PropertySource("../../../../../../../../application.properties")
public class DBConfig {

    @Bean
    public DataSource getDataSource()
    {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("db.driver");
        dataSourceBuilder.url("db.url");
        dataSourceBuilder.username("db.user");
        dataSourceBuilder.password("db.password");
        return dataSourceBuilder.build();
    }
}

错误:

10:58:11.577 [main] DEBUG com.zaxxer.hikari.HikariConfig - Driver class db.driver not found in Thread context class loader sun.misc.Launcher$AppClassLoader@18b4aac2, trying classloader sun.misc.Launcher$AppClassLoader@18b4aac2
10:58:11.580 [main] ERROR com.zaxxer.hikari.HikariConfig - Failed to load driver class db.driver from HikariConfig class classloader sun.misc.Launcher$AppClassLoader@18b4aac2
Exception in thread "main" org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under '' to com.zaxxer.hikari.HikariDataSource
    at org.springframework.boot.context.properties.bind.Binder.handleBindError(Binder.java:363)
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:323)
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:308)
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:238)
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:212)
    at org.springframework.boot.jdbc.DataSourceBuilder.bind(DataSourceBuilder.java:94)
    at org.springframework.boot.jdbc.DataSourceBuilder.build(DataSourceBuilder.java:75)
    at edu.bu.met.cs665.database.DataConfig.getDataSource(DataConfig.java:22)
    at edu.bu.met.cs665.database.CreateConnection.<init>(CreateConnection.java:26)
    at edu.bu.met.cs665.database.CreateConnection.getInstance(CreateConnection.java:35)
    at edu.bu.met.cs665.Main.seedDatabase(Main.java:51)
    at edu.bu.met.cs665.Main.main(Main.java:39)
Caused by: java.lang.IllegalStateException: Unable to set value for property driver-class-name
    at org.springframework.boot.context.properties.bind.JavaBeanBinder$BeanProperty.setValue(JavaBeanBinder.java:351)
    at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:98)
    at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:80)
    at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:56)
    at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject(Binder.java:451)
    at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:571)
    at org.springframework.boot.context.properties.bind.Binder$Context.withDataObject(Binder.java:557)
    at org.springframework.boot.context.properties.bind.Binder$Context.access0(Binder.java:512)
    at org.springframework.boot.context.properties.bind.Binder.bindDataObject(Binder.java:449)
    at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:390)
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:319)
    ... 10 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.context.properties.bind.JavaBeanBinder$BeanProperty.setValue(JavaBeanBinder.java:348)
    ... 20 more
Caused by: java.lang.RuntimeException: Failed to load driver class db.driver in either of HikariConfig class loader or Thread context classloader
    at com.zaxxer.hikari.HikariConfig.setDriverClassName(HikariConfig.java:486)

由于您使用的是 spring-boot,因此 application.properties 应该遵循标准,您不需要定义任何数据库配置,例如 DBConfig.java

这是您的 application.properties 的详细信息 https://spring.io/guides/gs/accessing-data-mysql/

Caused by: java.lang.RuntimeException: Failed to load driver class db.driver

这意味着 dataSourceBuilder.driverClassName("db.driver"); 作为值传递 db.driver 而不是值 com.mysql.cj.jdbc.Driver

您需要阅读那些配置属性的值。正如您现在拥有的那样,它将这些字段的 属性 名称作为值传递。以下应该适合你

import org.springframework.core.env.Environment;

@Configuration
@PropertySource("../../../../../../../../application.properties")
public class DBConfig {

    @Autowired
    Environment env;

    @Bean
    public DataSource getDataSource()
    {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName(env.getProperty("db.driver"));
        dataSourceBuilder.url(env.getProperty("db.url"));
        dataSourceBuilder.username(env.getProperty("db.user"));
        dataSourceBuilder.password(env.getProperty("db.password"));
        return dataSourceBuilder.build();
    }
}