如何解决 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();
}
}
我 运行 进入“无法为 属性 驱动程序-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();
}
}