Java 飞道初始阶

Java 飞道初始阶,java,spring-boot,flyway,Java,Spring Boot,Flyway,我有一个Java Spring启动应用程序,在Maven pom.xml中将Flyway配置为依赖项(我有一个父pom和一个项目pom…Flyway在我的项目pom中定义) 我可以运行一个maven任务,让Flyway运行migrate来创建/更新我的数据库,然后运行我的应用程序,但是我很难让它在正确的时间调用migrate,只需运行我的应用程序(这在prod中显然很重要)。看起来我的所有Spring类都是先实例化的,其中一些涉及到查看数据库,然后再进行Flyway迁移,因此,例如,如果在空数据

我有一个Java Spring启动应用程序,在Maven pom.xml中将Flyway配置为依赖项(我有一个父pom和一个项目pom…Flyway在我的项目pom中定义)

我可以运行一个maven任务,让Flyway运行
migrate
来创建/更新我的数据库,然后运行我的应用程序,但是我很难让它在正确的时间调用
migrate
,只需运行我的应用程序(这在prod中显然很重要)。看起来我的所有Spring类都是先实例化的,其中一些涉及到查看数据库,然后再进行Flyway迁移,因此,例如,如果在空数据库上运行应用程序,那么当尝试访问数据库中的任何内容时,应用程序会崩溃


关于在Spring Boot应用程序的启动过程中让Flyway更早地进行迁移的问题,有什么建议吗?

我不确定您的数据源配置是什么样子的,但是您可以以一种依赖于Flyway迁移的方式声明您的JPA配置


您可以在任何
@Config
类或数据源bean上声明
@DependsOn(“flyway”)
注释,“flyway”是您的flyway配置bean的声明名称。然后,在您的flyway配置bean上,使用initMethod属性限定bean注释,如下所示:
@bean(initMethod=“migrate”)

我不确定您的数据源配置是什么样子的,但是您可以以使其依赖于flyway迁移的方式声明JPA配置


您可以在任何
@Config
类或数据源bean上声明
@DependsOn(“flyway”)
注释,“flyway”是您的flyway配置bean的声明名称。然后,在您的flyway配置bean上,使用initMethod属性限定bean注释,如下所示:
@bean(initMethod=“migrate”)
尝试更改“flyway.out-of-order=false”

我建议您尝试使用类似ApplicationStartedEvent的事件列表器

 @EventListener
  public void migrate(ApplicationStartedEvent applicationStartedEvent) {
           //do some checks
           flyway.migrate();
  }


我建议您尝试使用事件列表器,如ApplicationStartedEvent

 @EventListener
  public void migrate(ApplicationStartedEvent applicationStartedEvent) {
           //do some checks
           flyway.migrate();
  }


在父pom中,是否存在Flyway依赖项。我们使用gradle,flyway显示在顶部。为了清楚起见,我已经在我的项目pom中定义了它,而不是我的父pom,但对于您的问题,虽然它列在第一位,但我没有指出任何特定的依赖项。也许我应该对此进行研究——否则,我可能还必须在代码中直接将其声明为已配置Bean,并在那里指示依赖关系。但无论哪种方式,我都不确定直接在Flyway上指示什么依赖项,因为依赖项指示之前必须配置什么。因此,我可能必须指出Flyway依赖于其他正在早期加载的东西。在您的父pom中,是否存在Flyway依赖关系。我们使用gradle,flyway显示在顶部。为了清楚起见,我已经在我的项目pom中定义了它,而不是我的父pom,但对于您的问题,虽然它列在第一位,但我没有指出任何特定的依赖项。也许我应该对此进行研究——否则,我可能还必须在代码中直接将其声明为已配置Bean,并在那里指示依赖关系。但无论哪种方式,我都不确定直接在Flyway上指示什么依赖项,因为依赖项指示之前必须配置什么。因此,我可能必须指出Flyway依赖于当前早期加载的其他东西。
 @EventListener
  public void migrate(ApplicationStartedEvent applicationStartedEvent) {
           //do some checks
           flyway.migrate();
  }