mybatis mulidatasource в Springboot с проблемой «найдено более одного« основного »компонента среди кандидатов» - PullRequest
0 голосов
/ 20 марта 2019

Эта проблема, которая заключается в том, что более чем один «основной» компонент обнаруживается среди кандидатов », всегда возникает, когда я настраиваю mybatis несколько источников данных в Springboot.

источники основных данных настроены следующим образом:

@Configuration
@MapperScan(basePackages = "com.monkey.myproject.dao.first", sqlSessionTemplateRef = "sqlSessionTemplate1")
public class DataSourceConfig1 {
    @Bean(name = "dataSource1")
    @ConfigurationProperties(prefix = "spring.datasource.first")
    @Primary
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "sqlSessionFactory1")
    @Primary
    public SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource1") DataSource dataSource1) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource1);
        bean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/first/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "transactionManager1")
    @Primary
    public DataSourceTransactionManager transactionManager1(@Qualifier("dataSource1") DataSource dataSource1) {
        return new DataSourceTransactionManager(dataSource1);
    }

    @Bean(name = "sqlSessionTemplate1")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate1(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory1)
            throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory1);
    }
}

подчиненные источники данных настроены следующим образом:

@Configuration
@MapperScan(basePackages = "com.monkey.myproject.dao.second", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class DataSourceConfig2 {
    @Bean(name = "dataSource2")
    @ConfigurationProperties(prefix = "spring.datasource.second")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "sqlSessionFactory2")
    public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource2) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource2);
        bean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/second/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "transactionManager2")
    public DataSourceTransactionManager transactionManager2(@Qualifier("dataSource2") DataSource dataSource2) {
        return new DataSourceTransactionManager(dataSource2);
    }

    @Bean(name = "sqlSessionTemplate2")
    public SqlSessionTemplate sqlSessionTemplate2(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory2)
            throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory2);
    }
}

Испытание Junit выглядит следующим образом:

@Autowired
@Qualifier("sqlSessionTemplate1")
private SqlSessionTemplate sqlSessionTemplate1;
@Test
public void test2() {
    try {
        sqlSessionTemplate1.insert("FirstMapper.insertOne", null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Когда этот тест выполняется, появляется сообщение об исключении, следующее:

more than one 'primary' bean found among candidates: [primaryDataSource, secondaryDataSource, dataSource1, dataSource2]

примечание. Когда я удаляю эту аннотацию '@Primary' из master, этот тестовый пример проходит. Но вот почему? Пожалуйста, помогите мне, спасибо заранее.

...