2015-03-19 10 views
5

Wie der Titel sagt, versuche ich Typesafe Configuration Properties zu verwenden, um eine Liste von DataSourceConfig Objekte zu laden. Ich habe lombok für Setter/GetterSpring boot @ConfigurationProperties nicht geladen

Die Hauptanwendungsklasse Anmerkungen

@Slf4j 
@SpringBootApplication 
@EnableConfigurationProperties 
public class Application { 

Die Konfiguration pojo

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

Die yml Datei

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

Schließlich ist die Federkonfiguration Klasse mit die Annotation @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; 
    } 

Mit der Config oben, erhalte ich:

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 

ich verschiedene Kombinationen ausprobiert habe. Wenn ich die Annotation zu @ConfigurationProperties(prefix="tenantdb.dataSourceConfig") ändere, erhalte ich den Fehler nicht, aber List<DataSourceConfig> ist leer.

HILFE !!

+0

Meine Konfigurationseigenschaften kommentierten sind mit '@ Component' und es wird während Komponente Scannen gefüllt haben hast du das probiert? Und noch zwei Dinge, wo 'datasources.yml' sich befindet und warum' getDataSourceConfig' als Bean notiert ist? –

+0

'datasources.yml' befindet sich im Klassenpfadstamm. 'getDataSourceConfig' ist als Bean annotiert, so dass ich es auch anderswo einfügen kann. – Raghu

+1

Ich habe versucht, mit Ihrem Code zu spielen, erstellt Test und ich bekomme eine Liste von 2 'DataSourceConfig' wie erwartet. Die einzige Sache ist, dass sie leer sind (habe 'null' für' key', 'dbname' und' dbpath'. Ich habe Setter für diese Klasse zur Verfügung gestellt und es ist in Ordnung, könnte das sein? –

Antwort

5

Sie sollten Konfigurationseigenschaften als einfache POJO mit nur Getter und Setter verwenden und separate HsqlConfiguration haben, die diese Eigenschaften injiziert hat.

Etwas wie folgt aus:

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

Und in separaten Klasse haben diese Eigenschaften injiziert, wie:

@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() 
} 
Verwandte Themen