Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 在Micronaut+;为Heroku Postgres冬眠_Spring_Hibernate_Heroku_Heroku Postgres_Micronaut - Fatal编程技术网

Spring 在Micronaut+;为Heroku Postgres冬眠

Spring 在Micronaut+;为Heroku Postgres冬眠,spring,hibernate,heroku,heroku-postgres,micronaut,Spring,Hibernate,Heroku,Heroku Postgres,Micronaut,我想在Heroku上部署一个应用程序。Heroku会不时更新数据库凭据,它们会自动将连接配置注入到一个环境变量中。可以解析此环境变量以获取用户、密码和URL 我试图按照他们推荐的方式进行数据源配置 @Factory //@Requires(env = Environment.HEROKU) public class HerokuDataSourceConfig { @Bean public DataSource dataSource() throws URISyntaxExce

我想在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的端点时,我得到了以下结果

不存在[javax.persistence.EntityManager]类型的bean。确保bean未被bean要求禁用(启用“io.micronaut.context.condition”的跟踪日志以进行检查),如果bean已启用,则确保将类声明为bean并启用注释处理(对于Java和Kotlin,“micronaut InjectJava”依赖项应配置为注释处理器).

我按照建议激活了跟踪,下面是一些相关的日志数据

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启动时,它将在某个点进入工厂并创建数据源。前面的日志是在调用数据源工厂之前打印的。

只需使用
@Bean
即可重复创建原型Bean。尝试使用:

@Singleton
@Primary
public DataSource dataSource()
...

与此同时,我在Heroku的帮助下找到了一个解决方案

对于使用gradle buildpack(如我的)的应用程序,Heroku将以下环境变量注入到容器中。起初我没有看到这些,我所知道的只是
DATABASE\uurl

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

很高兴你找到了解决办法。无论如何。我们可以读取该环境变量并将该数据库的URL拆分为:,@并找到主机、用户名和密码。

如果有机会,我将尝试此方法。同时,我为Heroku部署找到了另一个解决方案,我将把它添加到答案中。