2015-03-19 6 views
5

Как говорится в названии, я пытаюсь использовать Typesafe Configuration Properties для загрузки списка объектов DataSourceConfig. У меня есть Ломбки для инкубационных/добытчиковSpring boot @ConfigurationProperties не загружен

класса аннотаций

Основного применения

@Slf4j 
@SpringBootApplication 
@EnableConfigurationProperties 
public class Application { 

Конфигурации POJO

@Data 
public class DataSourceConfig { 
    private String key; 
    private String dbname; 
    private String dbpath; 
} 

YML файл

tenantdb: 
    dataSourceConfig: 
     - 
      key: default 
      dbpath: file:eventstore/jdbc/database 
      dbname: defaultdb 
     - 
      key: other 
      dbpath: file:eventstore/jdbc/other 
      dbname: dslfjsdf 

Наконец, класс Spring Конфигурации с аннотация @ConfigurationProperties.

@Configuration 
@Profile("hsqldb") 
@ImportResource(value = { "persistence-config.xml" }) 
@Slf4j 
@ConfigurationProperties(prefix="tenantdb", locations={"datasources.yml"}) 
public class HsqlConfiguration { 


    private List<DataSourceConfig> dataSourceConfig = new ArrayList<>(); 

    @Bean 
    public List<DataSourceConfig> getDataSourceConfig() { 
     return dataSourceConfig; 
    } 

С конфигой выше, я получаю:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hsqlConfiguration': Could not bind properties to [unknown] (target=tenantdb, ignoreInvalidFields=false, ignoreUnknownFields=true, ignoreNestedProperties=false); nested exception is java.lang.NullPointerException 
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:303) 
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:250) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initia 

Я пробовал различные комбинации. Если я изменю аннотацию на @ConfigurationProperties(prefix="tenantdb.dataSourceConfig"), я не получу ошибку, но List<DataSourceConfig> пуст.

HELP !!

+0

Мои свойства конфигурации аннотируются '@ Component' и заполняется в то время как компонент сканирования, которые вы это пробовали? Также есть еще две вещи, где находится 'datasources.yml' и почему« getDataSourceConfig »аннотируется как bean? –

+0

'datasources.yml' находится в корне. 'getDataSourceConfig' аннотируется как bean-компонент, так что я могу его внедрить и в другом месте. – Raghu

+1

Я попытался поиграть с вашим кодом, создал тест и получил список 2 'DataSourceConfig', как и ожидалось. Единственное, что они пустые (имеют «null» для 'key',' dbname' и 'dbpath'. Я предоставил сеттеры для этого класса, и он был привязан в порядке, может быть так? –

ответ

5

Вы должны использовать свойства конфигурации как простые POJO только с геттерами и сеттерами и иметь отдельный HsqlConfiguration, который вводит эти свойства.

Что-то вроде этого:

@Component 
@ConfigurationProperties(prefix="tenantdb", locations={"datasources.yml"}) 
public class TenantDbProperties { 

    //DataSourceConfig is POJO with key, dbpath and dbname 
    private List<DataSourceConfig> dataSourceConfigs;  

    public List<DataSourceConfig> getDataSourceConfigs(){ 
     return dataSourceConfigs; 
    } 

    public void setDataSourceConfigs(List<DataSourceConfig> dataSourceConfigs){ 
     this.dataSourceConfigs = dataSourceConfigs; 
    } 
} 

И в отдельном классе есть эти свойства впрыскивается как:

@Configuration 
@Profile("hsqldb") 
@ImportResource(value = { "persistence-config.xml" }) 
@Slf4j 
public class HsqlConfiguration { 

    @Autowired 
    private TenantDbProperties tenantDbProperties; 

    //code goes here where you can use tenantDbProperties.getDataSourceConfigs() 
}