настройка DataSource программно в Micronaut + Hibernate для Heroku Postgres - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть приложение, которое я хочу развернуть на Heroku.Heroku время от времени обновляет учетные данные базы данных, и они автоматически внедряют конфигурацию соединения в одну переменную среды.Эту переменную среды можно проанализировать для получения пользователя, пароля и URL-адреса.

Я попытался выполнить настройку источника данных способом, который они рекомендуют.

@Factory
//@Requires(env = Environment.HEROKU)
public class HerokuDataSourceConfig {

    @Bean
    public DataSource dataSource() throws URISyntaxException {
//        URI dbUri = new URI(System.getenv("DATABASE_URL"));

//        String username = dbUri.getUserInfo().split(":")[0];
//        String password = dbUri.getUserInfo().split(":")[1];
//        String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath() + "?sslmode=require";

        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/postgres");
        config.setUsername("postgres");
        config.setPassword("");
        config.setDriverClassName("org.postgresql.Driver");
        config.setConnectionTestQuery("SELECT 1");

        return new HikariUrlDataSource(config);
    }
}

Комментированные строки взяты изисходная конфигурация heroku, незакомментированный код предназначен только для локального тестирования.

Когда я пытаюсь запустить приложение и попасть в конечную точку, для которой требуется Hibernate, я получаю

No bean of type [javax.persistence.EntityManager] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).

Я активировал трассировку, как предложено, и вот некоторые соответствующие данные журнала

20:24:50.414 [pool-1-thread-15] DEBUG i.m.context.condition.Condition - Bean [Definition: io.micronaut.configuration.hibernate.jpa.EntityManagerFactoryBean] will not be loaded due to failing conditions:
20:24:50.414 [pool-1-thread-15] DEBUG i.m.context.condition.Condition - * No bean of type [interface org.hibernate.boot.SessionFactoryBuilder] present within context
20:28:04.598 [main] DEBUG i.m.context.condition.Condition - Bean [Definition: io.micronaut.jdbc.spring.DataSourceTransactionManagerFactory] will not be loaded due to failing conditions:
20:28:04.599 [main] DEBUG i.m.context.condition.Condition - * Custom condition [class io.micronaut.jdbc.spring.HibernatePresenceCondition] failed evaluation
20:28:04.895 [main] DEBUG i.m.context.condition.Condition - Bean [Definition: io.micronaut.configuration.hibernate.jpa.EntityManagerFactoryBean] will not be loaded due to failing conditions:
20:28:04.895 [main] DEBUG i.m.context.condition.Condition - * No bean of type [class org.hibernate.boot.MetadataSources] present within context
20:28:04.895 [main] DEBUG i.m.context.condition.Condition - Bean [Definition: io.micronaut.configuration.hibernate.jpa.EntityManagerFactoryBean] will not be loaded due to failing conditions:
20:28:04.896 [main] DEBUG i.m.context.condition.Condition - * No bean of type [interface org.hibernate.boot.SessionFactoryBuilder] present within context

Что я делаю не так?Возможно, конфигурация хорошая, но каким-то образом Micronaut не знает о моем недавно сконфигурированном источнике данных.

Когда я отлаживаю этот код во время запуска micronaut, он в какой-то момент входит на завод и создает источник данных.Предыдущие журналы печатаются до вызова фабрики источника данных.

Ответы [ 3 ]

2 голосов
/ 23 сентября 2019

Просто используя @Bean, это прототип bean, который создается неоднократно.Попробуйте использовать:

@Singleton
@Primary
public DataSource dataSource()
...
0 голосов
/ 23 сентября 2019

Рад, что вы нашли решение.В любом слючае.мы можем прочитать эту переменную среды и разделить эту DATABASE_URL на:, @ и найти хосты, имя пользователя и пароль.

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

Тем временем я нашел решение с помощью Heroku.

Для приложений, использующих пакет сборки gradle, как мой, Heroku внедряет в контейнер следующие переменные среды.Сначала я их не видел, все, что я знал, было DATABASE_URL

datasources:
  default:
    url: ${JDBC_DATABASE_URL}
    username: ${JDBC_DATABASE_USERNAME}
    password: ${JDBC_DATABASE_PASSWORD}
    driverClassName: org.postgresql.Driver
...