资源注释:没有定义[javax.sql.DataSource]类型的限定bean:期望的单个匹配bean但找到2

Har*_*ara 12 dependency-injection exception spring-data

我使用基于Spring Java的配置来配置Spring Data的多个数据库.在配置文件中,我正在创建两个data sourcefor MySQLMSSQL-Server.当尝试使用@Resource注释向实体管理器注入依赖项时,我遇到以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

以下是我的代码:

@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;
}
Run Code Online (Sandbox Code Playgroud)

我也试图使用@Qualifier注释作为建议我这个链接,但仍然得到错误.使用相同类型的2个bean:Spring中的javax.sql.DataSource

Mar*_*ahn 9

我遇到了同样的问题,经过很多头痛我偶然发现了这个让我感到愚蠢的文档 :(

所有你需要的是@Primary你的一个DataSources和Spring-Boot不会再混淆了...这是我的一个配置......其余的几乎完全相同,指向其他数据库并且没有@Primary on他们...

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:忘记提及:可能由于我的配置类的完成方式,在@EnableAutoConfiguration上排除某些类的方法对我不起作用...


ISp*_*kes 5

我遇到了同样的问题,并找到了解释它的旧帖子:

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

看起来如果你需要多个数据源,Spring Boot 的魔力就用完了,你必须手动接管配置。

就我而言,我必须修改 EnableAutoConfiguration 以自己接管数据源和事务管理器配置:

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class}) 
Run Code Online (Sandbox Code Playgroud)

看起来 Spring Boot 的魔力在我不得不使用多个数据源的时候用完了......


小智 5

我的情况是,配置是在xml文件上,所以我只需要将primary ="true"添加到其中一个已定义数据源的bean标记中.