2014-07-15 11 views
20

में एकाधिक डेटासोर्स और जेडीबीसी टेम्पलेट स्प्रिंग बूट प्रोजेक्ट में मैं एक विशिष्ट JdbcTemplate इंजेक्ट करना चाहता हूं। http://spring.io/blog/2014/05/27/spring-boot-1-1-0-m2-available-nowस्प्रिंग बूट (> 1.1.0)

मेरे कोड संकलन और चलती है, लेकिन केवल @Primary टिप्पणी के साथ डेटा स्रोत को ध्यान में रखा जाता है, कोई बात नहीं क्या मैं SqlService कक्षा में @Qualifier के रूप में रखा: क्या मैं बहुत DataSource विन्यास के लिए इस उदाहरण का अनुसरण करने की कोशिश की।

DatabaseConfig.java:

@Configuration 
public class DatabaseConfig { 

    @Bean(name = "dsSlave") 
    @ConfigurationProperties(prefix="spring.mysql_slave") 
    public DataSource slaveDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "dsMaster") 
    @Primary 
    @ConfigurationProperties(prefix="spring.mysql_master") 
    public DataSource masterDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "jdbcSlave") 
    @Autowired 
    @Qualifier("dsSlave") 
    public JdbcTemplate slaveJdbcTemplate(DataSource dsSlave) { 
     return new JdbcTemplate(dsSlave); 
    } 

    @Bean(name = "jdbcMaster") 
    @Autowired 
    @Qualifier("dsMaster") 
    public JdbcTemplate masterJdbcTemplate(DataSource dsMaster) { 
     return new JdbcTemplate(dsMaster); 
    } 

} 

और मैं एक त्वरित सेवा इसे आज़माने के लिए किया था: मेरा प्रासंगिक कोड निम्नलिखित है @Qualifier एनोटेशन स्थानांतरित करने के लिए

@Component 
public class SqlService { 

    @Autowired 
    @Qualifier("jdbcSlave") 
    private JdbcTemplate jdbcTemplate; 

    public String getHelloMessage() { 
     String host = jdbcTemplate.queryForObject("select @@hostname;", String.class); 
     System.out.println(host); 
     return "Hello"; 
    } 

} 
+1

तुम सच में autowiring की ज़रूरत है? अपने 'slaveJdbcTemplate' बीन विधि से 'slaveDataSource()' को क्यों न बुलाएं? स्वाभाविक रूप से थोड़ा तेज होना चाहिए। काम करने के लिए '@ क्वालीफायर 'के लिए यह पैरामीटर पर होना चाहिए, अब आप इंजेक्शन बिंदु पर अपने बीन को क्वालीफाई कर रहे हैं। –

+0

आपके उत्तर के लिए धन्यवाद, वास्तव में मुझे पैरामीटर में '@ क्वालीफायर' को स्थानांतरित करने की आवश्यकता है। आप ऑटोवॉयरिंग के बारे में सही नहीं हैं, मैं एक साधारण कॉल – Xavier

उत्तर

14

प्रयास करें:

SqlService.java के लिए विधियों पर parameter

मुझे लगता है, जब आप @Primary हटाने आप त्रुटि के साथ अंत में, जहां more than one appropriate beans are presented

+0

पर वापस जा सकता हूं यह बहुत अच्छा काम करता है। क्या आप लिंक साझा कर सकते हैं जहां आधिकारिक दस्तावेज़ीकरण में इस तकनीक का उल्लेख किया गया है। बस यह जानना कि मुझे कहाँ देखना चाहिए था। टी.के.एस। – nanospeck

+0

'जेपीए' का उपयोग करके दो अलग-अलग डेटा स्रोतों के साथ संचार करना कुछ जटिल है जैसा कि 'https: // github.com/वसंत-परियोजनाओं/वसंत-डेटा-उदाहरण/पेड़/मास्टर/जेपीए/एकाधिक डेटा स्रोतों में दिखाया गया है। क्या हम अलग-अलग डेटाबेस की तालिकाओं के साथ जेपीए का उपयोग करके संवाद करने के लिए 'माइस्क्ल टेम्पलेट' के दो अलग-अलग उदाहरण बनाने की उपर्युक्त प्रक्रिया का उपयोग कर सकते हैं? –

+0

अलग SO धागा –

17

यह इस तरह दिखता है चाहिए:

@Bean(name = "jdbcSlave") 
@Autowired 
public JdbcTemplate slaveJdbcTemplate(@Qualifier("dsSlave") DataSource dsSlave) { 
    return new JdbcTemplate(dsSlave); 
}