Использование @Value в PersistanceConfig - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь настроить базу данных динамически в зависимости от среды.Я хотел бы использовать @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, но ничего не помогло.

Спасибо заВаш совет.

1 Ответ

0 голосов
/ 02 декабря 2018

Проблема была довольно глупой.У меня был файл конфигурации в корне проекта, а не в корне папки src java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...