У меня есть приложение, которое я хочу развернуть на 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, он в какой-то момент входит на завод и создает источник данных.Предыдущие журналы печатаются до вызова фабрики источника данных.