2015-01-08 6 views
12

मैं स्प्रिंग डेटा के साथ एकाधिक डेटाबेस कॉन्फ़िगर करने के लिए स्प्रिंग जावा आधारित कॉन्फ़िगरेशन का उपयोग कर रहा हूं। कॉन्फ़िगरेशन फ़ाइल में, मैं और MSSQL-Server के लिए दो data source बना रहा हूं। जब @Resource एनोटेशन मैं निम्नलिखित अपवाद हो रही है का उपयोग करते हुए इकाई के प्रबंधक को निर्भरता इंजेक्षन करने की कोशिश कर:संसाधन एनोटेशन: प्रकार की कोई योग्यता बीन [javax.sql.DataSource] परिभाषित नहीं है: अपेक्षित एकल मिलान बीन लेकिन 2

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: mysql_datasource,secure_datasource 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1016) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:904) 
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:815) 
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:743) 

के बाद मेरी कोड है:

@Bean(name="secure_datasource") 
public DataSource dataSource(){ 
    try{ 
     ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
     dataSource.setJdbcUrl(environment.getProperty("sc.db.url")); 
     dataSource.setDriverClass(environment.getProperty("sc.db.driver.class")); 
     dataSource.setUser(environment.getProperty("sc.db.username")); 
     dataSource.setPassword(environment.getProperty("sc.db.password")); 
     dataSource.setIdleConnectionTestPeriod(60); 
     dataSource.setMaxPoolSize(10); 
     dataSource.setMaxStatements(7); 
     dataSource.setMinPoolSize(1); 
     return dataSource; 
    }catch(Exception ex){ 
     throw new RuntimeException(ex); 
    } 
} 

................. 

@Bean(name="mysql_datasource") 
public DataSource dataSource(){ 
    try{ 
     ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
     dataSource.setJdbcUrl(environment.getProperty("db.url")); 
     dataSource.setDriverClass(environment.getProperty("db.driver.class")); 
     dataSource.setUser(environment.getProperty("db.username")); 
     dataSource.setPassword(environment.getProperty("db.password")); 
     dataSource.setIdleConnectionTestPeriod(60); 
     dataSource.setMaxPoolSize(100); 
     dataSource.setMaxStatements(50); 
     dataSource.setMinPoolSize(10); 
     return dataSource; 
    }catch(Exception ex){ 
     throw new RuntimeException(ex); 
    } 
} 

....... 

@Resource(value="mysql_datasource") 
@Bean(name="entity_manager_factory") 
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource){ 
    LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); 
    factoryBean.setDataSource(dataSource); 
    factoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
    factoryBean.setPackagesToScan(environment.getProperty("package.scan")); 
    factoryBean.setJpaVendorAdapter(jpaVendorAdapter); 
    return factoryBean; 
} 

मैं भी रूप में @Qualifier एनोटेशन उपयोग करने के लिए कोशिश कर रहा हूँ मैं इस लिंक का सुझाव , लेकिन अभी भी त्रुटि हो रही है। Using 2 beans of the same type: javax.sql.DataSource in Spring

उत्तर

4

मैं एक ही समस्या थी और इस वर्ष के बाद कि यह समझाया पाया:

http://xantorohara.blogspot.ch/2013/11/spring-boot-jdbc-with-multiple.html

ऐसा लगता है कि अगर आप एकाधिक डेटा स्रोतों की जरूरत है, स्प्रिंग बूट जादू खत्म की तरह है, और आप ले जाना है मैन्युअल रूप से विन्यास पर।

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class}) 

यह वसंत बूट जादू की तरह लग रहा बिंदु पर बाहर भाग मैं कई का इस्तेमाल किया था:

मेरे मामले में, मैं डेटा स्रोत और लेनदेन प्रबंधक विन्यास अपने आप पर कब्जा करने EnableAutoConfiguration को संशोधित करने के लिए किया था डेटा स्रोतों ...

7

मैं एक ही समस्या थी और सिर दर्द का एक बहुत कुछ करने के बाद मैं इस doc कि मुझे वास्तव में गूंगा महसूस :(

आपको बस अपनी datasources और स्प्रिंग में से एक पर @Primary है पर ठोकर खाई -Bo OT अब और भ्रमित हो नहीं होगा ... यहाँ मेरी विन्यास में से एक है ... बाकी है, काफी समान हैं अन्य डीबीएस के लिए और उन पर कोई @Primary साथ ओर इशारा करते हुए ...

@Configuration 
@EnableTransactionManagement 
@EntityScan(basePackages = {"somepackage.entities"}) 
@EnableJpaRepositories(entityManagerFactoryRef = "emfDB1", transactionManagerRef = "tmDB1", basePackages = {"somepackage.repositories"}) 
class PersistenceDB1 { 
    @Bean 
    @Primary 
    DataSource dsDB1() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setUrl("jdbc:mysql://someserver:3306/proativo"); 
     dataSource.setUsername("username"); 
     dataSource.setPassword("password"); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     return dataSource; 
    } 

    @Bean 
    @Primary 
    LocalContainerEntityManagerFactoryBean emfDB1() { 
     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dsDB1()); 
     entityManagerFactoryBean.setJpaVendorAdapter(new EclipseLinkJpaVendorAdapter()); 

     entityManagerFactoryBean.setPersistenceXmlLocation("classpath:META-INF/DB1-persistence.xml"); 

     Properties jpaProperties = new Properties(); 
     jpaProperties.put("eclipselink.weaving", "false"); 
     jpaProperties.put("eclipselink.logging.level", "SEVERE"); // SEVERE/FINEST 

     entityManagerFactoryBean.setJpaProperties(jpaProperties); 
     return entityManagerFactoryBean; 
    } 

    @Bean 
    @Primary 
    JpaTransactionManager tmDB1() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(emfDB1().getNativeEntityManagerFactory()); 
     return transactionManager; 
    } 
} 

संपादित करें: उल्लेख करने के लिए भूल गए: शायद मेरी कॉन्फ़िगरेशन कक्षाओं के तरीके के कारण, @EnableAutoConfiguration पर कुछ कक्षाओं को छोड़ने की विधि मेरे लिए काम नहीं करती है ...

+0

मैंने @ प्राथमिक निर्देश जोड़ा लेकिन जब मैं लेनदेन प्रबंधक बना देता हूं, तो उनके दोनों सत्र कारखानों प्राथमिक डेटासोर्स का उपयोग करते हैं। क्या डेटासॉक्ट्री का उपयोग करने के लिए विशेष रूप से सत्रफैक्टरी को बताने का कोई तरीका है? – Sakib

+0

हमें शायद पता लगाने के लिए आपके कोड का थोड़ा सा पता होना चाहिए, जैसा कि आप उपरोक्त कोड में देख सकते हैं, सत्र प्रबंधक लेनदेन प्रबंधक निर्माण पर निर्दिष्ट है। –

4

मेरा मामला, कॉन्फ़िगरेशन xml फ़ाइल पर था, इसलिए मुझे केवल परिभाषित डेटा स्रोतों में से एक के बीन टैग में प्राथमिक = "सत्य" जोड़ना होगा।

संबंधित मुद्दे