2015-03-19 12 views
5

लोड नहीं होने के कारण, मैं ऑब्जेक्ट्स की सूची लोड करने के लिए Typesafe Configuration Properties का उपयोग करने का प्रयास कर रहा हूं। मैंस्प्रिंग बूट @ कॉन्फ़िगरेशनप्रॉपर्टीज

मुख्य आवेदन वर्ग एनोटेशन

@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 

अंत में, के साथ वसंत विन्यास वर्ग सेटर/टिककर खेल के लिए lombok है @ कॉन्फ़िगरेशनप्रॉपर्टीज एनोटेशन।

@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; 
    } 
config के साथ

ऊपर, मैं मिलता है:

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> खाली है।

सहायता !!

+0

मेरे विन्यास गुण @ Component' से एनोटेट 'और यह जबकि घटक स्कैनिंग भर जाता है, है तुमने कोशिश की? इसके अलावा दो और चीजें, 'datasources.yml' कहां स्थित है और बीन के रूप में एनोटेटेड' GetDataSourceConfig 'क्यों है? –

+0

'datasources.yml' क्लासपाथ रूट पर है। 'GetDataSourceConfig' को एक बीन के रूप में एनोटेट किया गया है ताकि मैं इसे कहीं और इंजेक्ट कर सकूं। – Raghu

+1

मैंने आपके कोड के साथ खेलने की कोशिश की, परीक्षण बनाया और मुझे उम्मीद के अनुसार 2 'डेटासोर्स कॉन्फिग' की सूची मिल गई। केवल एक चीज यह है कि वे खाली हैं ('कुंजी', 'dbname' और' dbpath' के लिए 'शून्य' है। मैंने उस वर्ग पर सेटर्स प्रदान किए हैं और यह ठीक से बाध्य है, हो सकता है कि यह हो? –

उत्तर

5

आपको कॉन्फ़िगरेशन गुणों को केवल पीओजेओ के रूप में केवल गेटर्स और सेटर्स के साथ उपयोग करना चाहिए और 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() 
}