Zonky + Spring Boot + Postgres +具有用户名和密码的Flyway

时间:2019-07-12 15:40:48

标签: spring postgresql spring-boot flyway

我们将Zonky用于由Postgres和Flyway支持的Spring Boot应用程序的集成测试。一切都像魅力一样。
但是,由于我们具有特定的数据库配置,因此应用程序用户没有DDL特权。因此,对于数据库迁移,我们有一个不同的数据库用户(具有DDL特权),可以通过spring.flyway.user进行设置。不幸的是,为飞行路线设置用户名会迫使FlywayAutoConfiguration创建专门用于飞行路线的内联数据源。这是一个问题,因为Zonky在启动Postgres实例后,使用具有正确的url / user / pass的那个覆盖了原始数据源bean。因此,Flyway尝试连接不存在的数据库,并以Connection Refused失败。 (请参见存储库上的issue

1 个答案:

答案 0 :(得分:1)

由于使用专用凭据为Flyway创建的数据源不是bean,因此Zonky对此无能为力。
一种解决方案是为Flyway创建数据源bean,并用@FlywayDataSource对其进行注释。但这意味着您还必须创建主数据源并将其设置为@Primary
在我们的例子中,我们使用了Spring Boot创建的数据源bean,因此我们没有采用上述解决方案。相反,我们在集成测试中添加了以下内容:

public class SpringFlywayCredentialsInitializer
        implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext c) {
        for (PropertySource<?> s : c.getEnvironment().getPropertySources()) {
            if (s.containsProperty("spring.flyway.user") 
                    && s instanceof MapPropertySource) {
                ((MapPropertySource) s).getSource().remove("spring.flyway.user");
            }
        }
    }
}