Hi Chris,
This works only if I include DataSourceConfiguration to the JavaConfigApplicationContext. If I include both DataSourceConfiguration and JpaConfiguration, the override does not work. It always falls back to the default datasource.
Here is my configuration classes for your reference.
JpaConfiguration
Code:
@Configuration
@AnnotationDrivenTx
@AnnotationDrivenConfig
@Import({DataSourceConfiguration.class})
public abstract class JpaConfiguration extends ConfigurationSupport {
@ExternalBean
abstract DataSource dataSource();
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.MySQLInnoDBDialect");
return adapter;
}
@Bean(lazy = Lazy.TRUE)
public EntityManagerFactory entityManagerFactory() {
Properties jpaProperties = new Properties();
jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
jpaProperties.put("hibernate.show_sql", true);
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setPersistenceUnitName("myPU");
em.setJpaDialect(jpaDialect());
em.setJpaProperties(jpaProperties);
em.setDataSource(dataSource());
em.setJpaVendorAdapter(jpaVendorAdapter());
em.setLoadTimeWeaver(loadTimeWeaver());
return this.getObject(em, EntityManagerFactory.class);
}
@Bean
public JpaDialect jpaDialect() {
return new HibernateJpaDialect();
}
@Bean
public InstrumentationLoadTimeWeaver loadTimeWeaver() {
return new InstrumentationLoadTimeWeaver();
}
@Bean(lazy = Lazy.TRUE)
public PlatformTransactionManager transactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory());
txManager.setJpaDialect(jpaDialect());
txManager.setDataSource(dataSource());
return txManager;
}
}
DataSourceConfiguration
Code:
@Configuration
public abstract class DataSourceConfiguration extends ConfigurationSupport {
@Bean(lazy = Lazy.TRUE)
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
CustomConfiguration config = customConfiguration();
dataSource.setDriverClassName(config.getDriverClass());
dataSource.setUrl(config.getJdbcUrl());
dataSource.setUsername(config.getJdbcUsername());
dataSource.setPassword(config.getJdbcPassword());
return dataSource;
}
@Bean
public CustomConfiguration customConfiguration() {
String driverClass = "org.h2.Driver";
String jdbcUrl = "jdbc:h2:mem:test";
String user = "sa";
String password = "";
CustomConfiguration config = new CustomConfiguration();
config.setDriverClass(driverClass);
config.setJdbcUrl(jdbcUrl);
config.setJdbcUsername(user);
config.setJdbcPassword(password);
return config;
}
}
CustomConfiguration
Code:
public class CustomConfiguration {
private String driverClass;
private String jdbcUrl;
private String jdbcUsername;
private String jdbcPassword;
//getters/setters omitted
}
Test
Code:
@Test
public void testOverrideConfig() throws Exception {
JavaConfigApplicationContext context = new JavaConfigApplicationContext(DataSourceConfiguration.class, JpaConfiguration.class);
//override default configuration
CustomConfiguration customConfig = context.getBean(CustomConfiguration.class);
customConfig.setDriverClass("com.mysql.jdbc.Driver");
customConfig.setJdbcUrl("jdbc:mysql://localhost/test");
customConfig.setJdbcUsername("root");
customConfig.setJdbcPassword("secret");
DataSource dataSource = context.getBean(DataSource.class);
Connection connection = dataSource.getConnection();
assertEquals("MySQL", connection.getMetaData().getDatabaseProductName());
}
Please clarify this issue.
Thanks!
Arul