当前位置: 首页 > 知识库问答 >
问题:

Spring和Flyway-在应用程序上下文启动之前迁移

萧麒
2023-03-14

正如标题所示,我正在寻找任何可以帮助我在Springs应用程序上下文(准确地说是持久性上下文)加载之前运行Flyway迁移的方法。原因是我在应用程序启动时运行的查询很少。这导致我的测试失败,因为正在对尚不存在的数据库表执行查询。我使用H2作为我的测试数据库。现在我只使用flyway核心依赖:

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>6.5.0</version>
    <scope>test</scope>
</dependency>

我有一个单一的Flyway配置类,如下所示:

@Configuration
class FlywayConfig {

    private static final String resourcePath = "classpath:flyway/migrations";
    private static final String sampleDataPath = "classpath:flyway/sample_data";

    @Bean
    Flyway flyway(@Value("${spring.datasource.url}") String dataSource,
                  @Value("${spring.datasource.username}") String username,
                  @Value("${spring.datasource.password}") String password) {


        FluentConfiguration fluentConfiguration = Flyway.configure().dataSource(dataSource, username, password);

        fluentConfiguration.locations(resourcePath, sampleDataPath);

        Flyway flyway = fluentConfiguration.load();

        return flyway;
    }
}

并且属性在应用程序中定义

spring:
  datasource:
    username: sa
    password: sa
    url: 'jdbc:h2:mem:testdb;Mode=Oracle;IGNORE_CATALOGS=TRUE;DB_CLOSE_DELAY=-1;'
    platform: h2
  h2:
    console:
      enabled: true
  jpa:
    show-sql: true

我想实现的是:1.飞行路线做迁移2。Spring上下文加载(按该特定顺序)

共有1个答案

公孙宏远
2023-03-14

通过在配置文件中手动创建< code>DataSource对象(而不是通过从< code>application.yml中自动弹出)并在< code>DataSource对象上使用< code>@DependsOn,我成功地完成了我想要的任务。这样,我确保了一旦我在< code>Flyway bean(顺便说一句,我也调整了它)中进行迁移,来自应用程序上下文的任何可能的数据库连接都将被建立。就在测试之前,我正在清理和迁移Flyway,现在我必须在初始化应用程序上下文beans的同时完成这项工作。下面是对我有用的代码:

@Configuration
class DatabaseConfig {

    private static final String resourcePath = "classpath:flyway/migrations";
    private static final String sampleDataPath = "classpath:flyway/sample_data";

    private static final String dataSourceUrl = "jdbc:h2:mem:testdb;Mode=Oracle;IGNORE_CATALOGS=TRUE;DB_CLOSE_DELAY=-1;";
    private static final String username = "sa";
    private static final String password = "sa";

    @Bean("flyway")
    public Flyway flyway() {

        FluentConfiguration fluentConfiguration = Flyway.configure().dataSource(dataSourceUrl, username, password);

        fluentConfiguration.locations(resourcePath, sampleDataPath);

        Flyway flyway = fluentConfiguration.load();

        flyway.clean();
        flyway.migrate();

        return flyway;
    }

    @DependsOn("flyway")
    @Bean
    public DataSource dataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.h2.Driver");
        dataSourceBuilder.url(dataSourceUrl);
        dataSourceBuilder.username(username);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();
    }
}

这里是应用程序.yml文件(我删除了数据源相关记录):

spring:
  h2:
    console:
      enabled: true
  jpa:
    show-sql: true

flyway:
  enabled: false
 类似资料:
  • 我有一个带有几个实体类的Spring Boot应用程序,我正在尝试用Flyway实现数据库迁移。在启动时,似乎Spring Boot根本没有运行flyway。 这是我的应用程序.属性 这是我的建筑里的线.Gradle和flyway有关

  • 我必须为microservice X创建一个集成测试,它可以从外部sftp服务器下载、处理和导入csv文件。整个过程由一个Spring Boot调度程序任务启动,该任务启动一个spring批处理作业来处理和导入数据。导入过程由spring batch writer完成,它是一个restTemplate存储库(因此它调用对另一个微服务的post请求)。 我已经设法模拟了sftp服务器,在其上放置了一

  • 在单元测试中启动和正常关闭Spring应用程序的推荐方法是什么?我知道JUnit5的SpringExtension,但它在测试方法执行之前/之后启动和停止Spring上下文。 我想用测试方法启动和停止spring上下文,因为我想验证是否调用了某些方法(尤其是在关机期间)。 有没有推荐的方法来实现这一点?

  • 我正在开发一个Spring MVC REST API。一切正常,这很好,但我从日志中注意到,每次重新启动应用程序时,applicationContext都会加载两次:一次是tomcat加载war文件,第二次是客户端第一次访问web应用程序。 我将举几个例子: 就在我启动雄猫之后: ... 然后此刻我执行第一个API调用: 这肯定不是正常行为吧?我的web.xml是这样的: http://java.

  • 我们的webstart应用程序(不是小程序)遇到了奇怪的启动问题。 启动应用程序会显示应用程序启动屏幕,但javaws进程会在不久后终止,不会在对话框、java控制台或日志文件中显示任何错误消息。javaws似乎只是在实际启动实际应用程序之前停止。无论用户尝试从桌面快捷方式还是从网页启动应用程序,都无关紧要。当从本地计算机使用javaw运行而无需webstart时,相同的应用程序可以正常工作。 应

  • 在Spring Boot中,文档似乎鼓励在应用程序启动时运行迁移。 这很好,但有时应用程序启动可能会有副作用/依赖性,我不想麻烦-我只想自己运行迁移。设想一下,只需建立一个本地开发人员数据库,就可以在其中闲逛,甚至不用运行应用程序。 相比之下,在Dropwanner中,单独运行迁移对于应用程序的内置参数来说很简单,就像这样 Spring靴有什么等价物吗?还是我必须直接去喝liquibase? 我对