一尘不染

带有MyBatis的Spring:预期有单个匹配的bean,但是找到了2

spring-boot

我一直在将MyBatis与Spring结合使用,并且对于单个数据库来说,它一直运行得很好。尝试添加另一个数据库时遇到了困难(请参阅Github上的可复制示例)。

我正在使用Spring Java配置(即不是XML)。我看过的大多数示例都显示了如何使用XML实现此目的。

我有两个像这样的数据配置类(A和B):

@Configuration
@MapperScan("io.woolford.database.mapper")
public class DataConfigDatabaseA {

    @Bean(name="dataSourceA")
    public DataSource dataSourceA() throws SQLException {
        SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
        dataSource.setDriver(new com.mysql.jdbc.Driver());
        dataSource.setUrl("jdbc:mysql://" + dbHostA + "/" + dbDatabaseA);
        dataSource.setUsername(dbUserA);
        dataSource.setPassword(dbPasswordA);
        return dataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSourceA());
        return sessionFactory.getObject();
    }
}

两个映射器,以及一个自动连接映射器的服务:

@Service
public class DbService {

    @Autowired
    private DbMapperA dbMapperA;

    @Autowired
    private DbMapperB dbMapperB;

    public List<Record> getDabaseARecords(){
        return dbMapperA.getDatabaseARecords();
    }

    public List<Record> getDabaseBRecords(){
        return dbMapperB.getDatabaseBRecords();
    }

}

该应用程序无法启动:

Error creating bean with name 'dataSourceInitializer': 
  Invocation of init method failed; nested exception is 
    org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
      No qualifying bean of type [javax.sql.DataSource] is defined: 
        expected single matching bean but found 2: dataSourceB,dataSourceA

我已经读到可以使用@Qualifier注释消除自动装配的歧义,尽管我不确定在哪里添加它。

你能看到我哪里出问题了吗?


阅读 326

收藏
2020-05-30

共1个答案

一尘不染

最后,我们将每个映射器放在其自己的文件夹中:

src/main/java/io/woolford/database/mapper/a/DbMapperA.java
src/main/java/io/woolford/database/mapper/c/DbMapperB.java

然后DataConfig,我们创建了两个类,每个数据库一个。该@MapperScan批注解决了expected single matching bean but found 2问题。

@Configuration
@MapperScan(value = {"io.woolford.database.mapper.a"}, sqlSessionFactoryRef="sqlSessionFactoryA")
public class DataConfigDatabaseA {

必须将@Primary注释添加到以下DataConfig类之一中的bean :

@Bean(name="dataSourceA")
@Primary
public DataSource dataSourceA() throws SQLException {
    ...
}

@Bean(name="sqlSessionFactoryA")
@Primary
public SqlSessionFactory sqlSessionFactoryA() throws Exception {
    ...
}

感谢所有提供帮助的人。毫无疑问,有多种方法可以做到这一点。我确实尝试过@Qualifier并`@EnableAutoConfiguration(exclude

{DataSourceAutoConfiguration.class})`按照@eduardlofitskyi和@GeminiKeith的建议进行操作,但这会产生一些进一步的错误。

如果有用,可以在这里找到对我们有用的解决方案:https : //github.com/alexwoolford/mybatis-
spring-multiple-mysql-reproducible-
example

2020-05-30