Я пытаюсь настроить базу данных динамически в зависимости от среды.Я хотел бы использовать @Value для получения информации о базе данных.
Мой файл конфигурации:
@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "service")
@PropertySource("classpath:application-${environment}.properties")
@EnableJpaRepositories("repositories")
public class PersistanceConfig {
private final String MODEL_PATH = "model";
@Value("${mariadb.driver}:#{null}")
private String driver;
@Value("${mariadb.url}:#{null}")
private String url;
@Value("${mariadb.username}:#{null}")
private String username;
@Value("${mariadb.password}:#{null}")
private String password;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] {MODEL_PATH});
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());
return em;
}
@Bean
public DataSource dataSource(){
Assert.notNull(driver, "JBDC driver is not defined");
Assert.notNull(url, "url is not defined");
Assert.notNull(username, "username is not defined");
Assert.notNull(password, "password is not defined");
final BasicDataSource source = new BasicDataSource();
source.setDriverClassName(driver);
source.setUrl(url);
source.setUsername(username);
source.setPassword(password);
return source;
}
@Bean
public PlatformTransactionManager transactionManager(
EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
properties.setProperty(
"hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
return properties;
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
}
Во время компиляции правильно найден файл свойств и переменные драйвер, URL, имя пользователя и парольправильно заполнены.
К сожалению, во время выполнения @Value не выполняется и не заполняет выражение в переменную (следующие исключения: «Не удалось использовать« $ {mariadb.driver} 'для подключения »).
Согласно другому ответу здесь, я добавил статический компонент PropertySourcesPlaceholderConfigurer, но у меня ничего не вышло.
Я также попробовал другую комбинацию значений класса Environmnet и PropertySource, но ничего не помогло.
Спасибо заВаш совет.