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

mec1mxoz  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(423)

我遇到了一个“无法为属性驱动程序类名设置值”(请参阅最后一段了解完整的错误详细信息)。我已经阅读了其他几篇文章,似乎表明我有这个设置正确,但我不能找出我错过了什么,所以我提前道歉,因为使用属性文件是新的我。是什么导致了这个错误?
应用程序属性:


# 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$5(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.access$300(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)
5m1hhzi4

5m1hhzi41#

原因:java.lang.runtimeexception:未能加载驱动程序类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();
    }
}
f3temu5u

f3temu5u2#

既然你用的是 spring-boot 所以application.properties应该遵循标准,您不需要定义任何数据库配置,比如dbconfig.java
以下是您的 application.properties 看起来像https://spring.io/guides/gs/accessing-data-mysql/

相关问题