application.yml 中的绑定属性不起作用

问题描述 投票:0回答:2

在我的 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 类。没有必要吗?

java spring-boot sqlite spring-data-jpa spring-data
2个回答
0
投票

配置属性的常用方法是将它们保存在单独的类中并使用

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

0
投票

您只需要在您的

DBConfig
类中为字段添加 setter 即可。

© www.soinside.com 2019 - 2024. All rights reserved.