在我的 SpringBoot 项目中,我在 src/main/resources/ 中有 application.yml 文件:
server:
port: 8080
spring:
datasource:
driver-class-name: org.sqlite.JDBC
...
我想将上面定义的属性绑定到Java类:
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DBConfig {
// I wished spring-boot could automatically bind it with 'driver-class-name' in application.yml
private String driverClassName;
...
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(driverClassName);
...
return dataSource;
}
}
我有注释
@Configuration
和@ConfigurationProperties(prefix = "spring.datasource")
。我还指定了正确的前缀。但是当我运行我的应用程序时,我收到错误:
引起:org.springframework.beans.factory.BeanCreationException:创建在类路径资源[com/my/webapp/config/DBConfig.class]中定义的名为“dataSource”的bean时出错:无法实例化[javax.sql.DataSource ]:工厂方法“dataSource”抛出异常并显示消息:属性“driverClassName”不能为空
错误告诉
driverClassName
是一个空字符串,因此绑定不起作用。我缺少什么?我使用的是 SQLite 数据库,它在 SpringBoot 中的支持不如 MySQL、MariaDB 等。因此,我提供了一个数据源 bean 类,将 application.yml 中的数据库配置绑定到手动创建的 bean 类。没有必要吗?
配置属性的常用方法是将它们保存在单独的类中并使用
@EnableConfigurationProperties
激活它们。您可以阅读这篇文章。您可以尝试以下操作:
@Configuration
@EnableConfigurationProperties(MyConfigurationProperties.class)
public class DBConfig {
@Autowired
private MyConfigurationProperties props;
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(props.getDriverClassName());
// ...
return dataSource;
}
}
你的属性类将如下所示:
@ConfigurationProperties(prefix = "spring.datasource")
public class MyConfigurationProperties {
private String driverClassName;
// getters ans setters are here
}
但我不确定这是否是最好的解决方案,因为 Spring 已经有自己的配置属性类绑定到前缀
spring.datasource
。
第二个选项是使用 Spring 配置属性:
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
// ...
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DBConfig {
@Autowired
private DataSourceProperties props;
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(props.getDriverClassName());
// ...
return dataSource;
}
}
您只需要在您的
DBConfig
类中为字段添加 setter 即可。