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()
}