Spring boot @ConfigurationProperties не загружен

Как видно из заголовка, я пытаюсь использовать свойства конфигурации Typesafe для загрузки списка DataSourceConfig объекты. У меня есть ломбок для сеттера / геттера

Основные аннотации класса приложения

@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 Configuration с аннотацией @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> пустой.

ПОМОГИТЕ!!

1 ответ

Решение

Вы должны использовать свойства конфигурации как простой 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()
}
Другие вопросы по тегам