Roger
Roger

Reputation: 11051

Selecting DataSource bean for use with multiple DataSourceInitializers

I have two DataSource beans and two DataSourceInitializer beans, one for each DataSource. These configurations are in different class files, but both DataSourceInitializers attempt to set up DataSourceOne.

How can I tell the DataSourceInitializerTwo to use (inject?) the DataSourceTwo bean?

//Data Source 1
@Bean
public DataSource dataSourceOne() {
    JdbcDataSource ds = new JdbcDataSource();
    ds.setUrl("jdbc:h2:mem:app1db;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2;INIT=CREATE SCHEMA IF NOT EXISTS app1\\;SET SCHEMA app1");
    ds.setUser("app1");
    ds.setPassword("app1");
    return ds;
}

@Bean
public DataSourceInitializer dataSourceInitializerOne(final DataSource dataSource) {
    final DataSourceInitializer initializer = new DataSourceInitializer();
    initializer.setDataSource(dataSource);
    initializer.setDatabasePopulator(DatabasePopulator());
    return initializer;
}

//Data Source 2
@Bean
public DataSource dataSourceTwo() {
    JdbcDataSource ds = new JdbcDataSource();
    ds.setUrl("jdbc:h2:mem:app1db;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2;INIT=CREATE SCHEMA IF NOT EXISTS app2\\;SET SCHEMA app2");
    ds.setUser("app2");
    ds.setPassword("app2");
    return ds;
}

@Bean
public DataSourceInitializer dataSourceInitializerTwo(final DataSource dataSource) {
    final DataSourceInitializer initializer = new DataSourceInitializer();
    initializer.setDataSource(dataSourceTwo);
    initializer.setDatabasePopulator(databasePopulatorTwo());
    return initializer;
}

Upvotes: 1

Views: 855

Answers (1)

Roger
Roger

Reputation: 11051

The DataSourceInitializer method appears to inject a DataSource bean based on parameter name. Simply make the name of your method that returns a DataSource match the name of the DataSource parameter that your appropriate initializer method takes in.

//Data Source 1
@Bean
public DataSource dataSourceOne() {
    JdbcDataSource ds = new JdbcDataSource();
    ds.setUrl("jdbc:h2:mem:app1db;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2;INIT=CREATE SCHEMA IF NOT EXISTS app1\\;SET SCHEMA app1");
    ds.setUser("app1");
    ds.setPassword("app1");
    return ds;
}

@Bean
public DataSourceInitializer dataSourceInitializerOne(final DataSource dataSourceOne) {
    final DataSourceInitializer initializer = new DataSourceInitializer();
    initializer.setDataSource(dataSourceOne);
    initializer.setDatabasePopulator(DatabasePopulator());
    return initializer;
}

//Data Source 2
@Bean
public DataSource dataSourceTwo() {
    JdbcDataSource ds = new JdbcDataSource();
    ds.setUrl("jdbc:h2:mem:app1db;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2;INIT=CREATE SCHEMA IF NOT EXISTS app2\\;SET SCHEMA app2");
    ds.setUser("app2");
    ds.setPassword("app2");
    return ds;
}

@Bean
public DataSourceInitializer dataSourceInitializerTwo(final DataSource dataSourceTwo) {
    final DataSourceInitializer initializer = new DataSourceInitializer();
    initializer.setDataSource(dataSourceTwo);
    initializer.setDatabasePopulator(databasePopulatorTwo());
    return initializer;
}

Upvotes: 1

Related Questions