Spring Boot 1.4:在Liquibase完成后执行方法

14

我有一个基于Spring Boot 1.4.0的项目,使用了Liquibase。

在liquibase完成后执行方法是否可能?

是否像Bean Post Processor那样实现?

我的目标是在应用程序以开发模式启动时向数据库添加一些数据。在开发模式下,应用程序使用内存中的h2数据库,因此liquibase必须在我编写数据之前创建表。

2个回答

38

Spring Boot自动配置了一个名为liquibaseSpringLiquibase bean。任何依赖于此bean的bean都将在Liquibase完成后创建。例如,您可以使用@PostConstruct来填充数据库:

@Bean
@DependsOn("liquibase")
public YourBean yourBean() {
    return new YourBean();
}

static class YourBean {

    @PostConstruct
    public void populateDatabase() {
        System.out.println("This will be called after Liquibase has finished");
    }

}

感谢 :) 美妙的解决方案 - Yannic Bürgmann
1
抱歉评论了旧问题。 如果 YourBeanliquibase 在不同的线程上怎么办? 我有相同的用例,但这个解决方案对我不起作用。 有什么想法吗? - Amir Choubani
2
应用程序上下文刷新是单线程的。你是如何陷入两个bean并行初始化的情况的? - Andy Wilkinson
我正在使用jhipster。 liquibase bean在其他线程中初始化。 https://github.com/jhipster/jhipster/blob/master/jhipster-framework/src/main/java/io/github/jhipster/config/liquibase/AsyncSpringLiquibase.java - Amir Choubani
2
正如您所链接的类的Javadoc所述,如果您想在启动时进行数据库请求,您将需要使用标准的 SpringLiquibase - Andy Wilkinson
我在多租户应用程序中遇到了一个问题,当我创建一个数据库并在其上运行liquibase时,应用程序会重新启动,我不知道为什么。你有任何想法如何解决它吗? - Hafiz Hamza

2
另一种解决方案是让LiquiBase将这些内容插入到您的数据库中 - 但仅在开发模式下运行时才这样做。
您可以通过在LiquiBase中指定context = ""属性来实现此目的。
另一种选择是只有在dbms =“h2db”(忘记选择h2的确切字符串是什么,请查看文档!)时,才让LiquiBase将此测试数据插入到您的数据库中。
这两个选项都是在changesets上的属性。
对于这种情况,这是我自己首选的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接