gpt4 book ai didi

exception - 资源注释 : No qualifying bean of type [javax. sql.DataSource] 已定义:预期单个匹配 bean 但找到 2

转载 作者:行者123 更新时间:2023-12-04 00:46:55 27 4
gpt4 key购买 nike

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

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

最佳答案

我遇到了同样的问题,经过很多头痛后,我偶然发现了这个 doc这让我觉得很愚蠢:(

您只需要在其中一个数据源上使用@Primary,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;
}
}

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

关于exception - 资源注释 : No qualifying bean of type [javax. sql.DataSource] 已定义:预期单个匹配 bean 但找到 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27843788/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com