Источник множественных данных Spring без первичного - PullRequest
1 голос
/ 26 сентября 2019

У меня проблема, мне нужно создать два DataSource, но я не могу использовать @Primary, потому что в другом модуле у меня также есть два DataSource, а затем в третьем модуле я включаю оба модуля, поэтому есть два основных модуля.

Я хотел использовать @Qualifier, но он не работает.

@Bean(name = "secondDataSourceProperties")
@ConfigurationProperties("second")
public DataSourceProperties secondDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean(name = "secondDataSource")
@ConfigurationProperties("second.configuration")
public DataSource secondDataSource(@Qualifier("secondDataSourceProperties") DataSourceProperties dataSourceProperties) {
    HikariDataSource ds = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    ds.setConnectionTestQuery("SELECT 1");
    ds.setConnectionInitSql("SELECT 1");
    ds.setPoolName("jdbc/second");
    return ds;
}

@Bean(name = "secondTransactionManager")
public DataSourceTransactionManager secondDataSourceTransactionManager(@Qualifier("secondDataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

@Bean
@ConfigurationProperties("first")
public DataSourceProperties firstDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean(name = "firstDataSource")
@ConfigurationProperties("first.configuration")
public DataSource firstDataSource(@Qualifier("firstDataSourceProperties") DataSourceProperties dataSourceProperties) {
    HikariDataSource ds = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    ds.setConnectionTestQuery("SELECT 1");
    ds.setConnectionInitSql("SELECT 1");
    ds.setPoolName("jdbc/first");
    return ds;
}

@Bean(name = "firstTransactionManager")
public DataSourceTransactionManager firstDataSourceTransactionManager(@Qualifier("firstDataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

Ошибка, которую я получаю:

Нет подходящего компонента типаДоступно 'org.springframework.boot.autoconfigure.jdbc.DataSourceProperties': ожидаемый единый соответствующий бин, но найдено 5: secondDataSourceProperties, firstDataSourceProperties, 3DataSourceProperties, 4DataSourceProperties, spring.datasource-org.springframeProconset.ар.1014 *

Я использую DataSource, например, в коде:

@Autowired
@Qualifier("first")
private DataSource dataSource;

и

@Transactional(value = "firstTransactionManager")

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Помогло добавить

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

Или, если вы используете @ SpringBootApplication

@SpringBootApplication(scanBasePackages={"a.b.c"}, exclude = {DataSourceAutoConfiguration.class})
0 голосов
/ 26 сентября 2019

Как насчет просто сделать следующее?Без @Qualifier беспорядка?Имя метода для @Bean по умолчанию используется в качестве «квалификатора» bean-компонента.

@Bean
@ConfigurationProperties("first")
public DataSourceProperties firstDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@ConfigurationProperties("second")
public DataSourceProperties secondDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
public DataSource firstDataSource(DataSourceProperties firstDataSourceProperties) {
    HikariDataSource ds = firstDataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    ds.setConnectionTestQuery("SELECT 1");
    ds.setConnectionInitSql("SELECT 1");
    ds.setPoolName("jdbc/first");
    return ds;
}

@Bean
public DataSource secondDataSource(DataSourceProperties secondDataSourceProperties) {
    HikariDataSource ds = secondDataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    ds.setConnectionTestQuery("SELECT 1");
    ds.setConnectionInitSql("SELECT 1");
    ds.setPoolName("jdbc/second");
    return ds;
}

@Bean
public DataSourceTransactionManager firstTransactionManager(DataSource firstDataSource) {
    return new DataSourceTransactionManager(firstDataSource);
}

@Bean
public DataSourceTransactionManager secondTransactionManager(DataSource secondDataSource) {
    return new DataSourceTransactionManager(secondDataSource);
}

Вы можете просто выполнить автоматическое подключение только с этим именем;

@Autowire
private DataSource firstDateSource;

и

@Transactional("secondTransactionManager")
...