没有可用的“javax.sql.DataSource”类型的合格 bean:在候选中找到多个“主要”bean:

Posted

技术标签:

【中文标题】没有可用的“javax.sql.DataSource”类型的合格 bean:在候选中找到多个“主要”bean:【英文标题】:No qualifying bean of type 'javax.sql.DataSource' available: more than one 'primary' bean found among candidates: 【发布时间】:2020-03-19 00:52:37 【问题描述】:

我想将 Spring Boot 配置为使用 2 个 JNDI 数据源。我试过这个配置:

application.properties

spring.production-datasource.jndi-name=java:/global/production_gateway
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update

spring.warehouse-datasource.jndi-name=java:/global/production_warehouse
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update

主数据库

@Configuration
@EnableJpaRepositories(
        basePackages = "org.datalis.plugin.production.entity", 
        entityManagerFactoryRef = "productionEntityManager", 
        transactionManagerRef = "productionTransactionManager"
    )
@EnableTransactionManagement
public class ContextProductionDatasource 

    @Autowired
    private Environment env;

    @Primary
    @Bean
    @ConfigurationProperties(prefix="spring.production-datasource")
    public DataSource productionDataSource() 
        return DataSourceBuilder.create().build();
    

    @Primary
    @Bean   
    public EntityManager productionEntityManager(EntityManagerFactory emf) 
        return emf.createEntityManager();
    

    @Primary
    @Bean
    public PlatformTransactionManager productionTransactionManager(final EntityManagerFactory emf) 
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    

    @Primary
    @Bean
    public PersistenceExceptionTranslationPostProcessor productionExceptionTranslation() 
        return new PersistenceExceptionTranslationPostProcessor();
    

第二个数据源:

@Configuration
@EnableJpaRepositories(
        basePackages = "org.datalis.plugin.warehouse.entity", 
        entityManagerFactoryRef = "warehouseEntityManager", 
        transactionManagerRef = "warehouseTransactionManager"
    )
@EnableTransactionManagement
public class ContextWarehouseDatasource 

    @Autowired
    private Environment env;

    @Primary
    @Bean
    @ConfigurationProperties(prefix="spring.warehouse-datasource")
    public DataSource warehouseDataSource() 
        return DataSourceBuilder.create().build();
    

    @Bean   
    public EntityManager warehouseEntityManager(EntityManagerFactory emf) 
        return emf.createEntityManager();
    

    @Bean
    public PlatformTransactionManager warehouseTransactionManager(final EntityManagerFactory emf) 
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    

    @Bean
    public PersistenceExceptionTranslationPostProcessor warehouseExceptionTranslation() 
        return new PersistenceExceptionTranslationPostProcessor();
    

当我部署代码时出现异常:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: more than one 'primary' bean found among candidates: [productio                     nDataSource, warehouseDataSource]"

完整的错误堆栈:

https://pastebin.com/EsNp2Fp9

你知道我该如何解决这个问题吗?

【问题讨论】:

[Spring Data JPA - 多个 EnableJpaRepositories ](***.com/questions/45663025/…) 的可能副本。根据那篇文章和我的知识,我相信您需要更改 EntityManager bean 实现以实现自定义 EntityManager bean 并在 bean 创建期间设置每个数据源。 【参考方案1】:

您只能拥有 1 个主数据源。其他配置看起来不错。

假设ContextWarehouseDatasource作为辅助连接

像这样从warehouseDataSource() 中删除@Primary 并尝试。

@Bean
@ConfigurationProperties(prefix="spring.warehouse-datasource")
public DataSource warehouseDataSource() 
    return DataSourceBuilder.create().build();

【讨论】:

以上是关于没有可用的“javax.sql.DataSource”类型的合格 bean:在候选中找到多个“主要”bean:的主要内容,如果未能解决你的问题,请参考以下文章

没有可用的来源..浏览以查找来源

避免在数据表中呈现“表中没有可用数据”

国内都有哪些靠谱的 Javascript 库 CDN可用

没有可用的缓冲空间

MPAndroidChart - 更改消息“没有可用的图表数据”

没有可用的数据数据表