sqlite 绑定应用程序中的属性,yml不工作

oknrviil  于 2023-10-23  发布在  SQLite
关注(0)|答案(2)|浏览(136)

在我的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数据库不像MySQL,MariaDB等那样支持。在SpringBoot。因此我提供了一个datasourcebean类来将application.yml中的数据库配置绑定到手动创建的bean类。有必要吗?

ygya80vv

ygya80vv1#

配置属性的常用方法是将它们保存在单独的类中,并使用@EnableConfigurationProperties激活它们。你可以读这个article。你可以尝试如下操作:

@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;
    }
}
dohp0rv5

dohp0rv52#

你只需要在你的DBConfig类中为fields添加setter就可以了。

相关问题