【问题标题】:BeanCreationException for Flyway set up for Postgres为 Postgres 设置 Flyway 的 BeanCreationException
【发布时间】:2019-08-11 23:45:12
【问题描述】:

当我尝试构建存储库模块时,我收到 Flyway 配置的 BeanCreationException。尝试了多种方法,但没有运气。有人可以帮我解决这个问题吗?

错误:

启动 ApplicationContext 时出错。要显示自动配置报告,请在启用“调试”的情况下重新运行您的应用程序。 2019-03-21 06:11:15.404 错误 13480 --- [main] os.boot.SpringApplication:应用程序启动失败 org.springframework.beans.factory.BeanCreationException:创建 com.repository.TestConfig 中定义的名称为“flyway”的 bean 时出错:通过工厂方法实例化 bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.flywaydb.core.Flyway]:工厂方法“flyway”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“dataSource”的 bean 时出错:调用 init 方法失败;嵌套异常是 java.lang.IllegalStateException: 无法用嵌入式数据库替换 DataSource 以进行测试。如果您想要一个嵌入式数据库,请在类路径中放置一个受支持的数据库或调整 @AutoconfigureTestDatabase 的替换属性。

TestConfig 类:

@Configuration
@EnableJpaRepositories(basePackages = "com.repository")
@EntityScan(basePackages = {"com.insurance.*"})
@EnableTransactionManagement
@Slf4j
public class TestConfig {
@Bean
public DataSource dataSource() throws IOException {
    return embeddedPostgres().getPostgresDatabase();
}

@Bean
public EmbeddedPostgres embeddedPostgres() throws IOException {
    return EmbeddedPostgres.start();
}

@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
    return new HibernateExceptionTranslator();
}

@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
}

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) throws IOException {
    return new JdbcTemplate(dataSource);
}

@Bean
public Flyway flyway() throws IOException {
    Flyway flyway = new Flyway();
    flyway.setDataSource(dataSource());
    flyway.setLocations("db/migration");
    flyway.migrate();
    return flyway;
}
}

pom.xml的sn-p

    <dependency>
        <groupId>com.opentable.components</groupId>
        <artifactId>otj-pg-embedded</artifactId>
        <version>0.10.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>

测试类:

@RunWith(SpringRunner.class)
@DataJpaTest
@ContextConfiguration(classes = TestConfig.class)
public class InsuranceRepositoryTest {
---//Test methods 
}

【问题讨论】:

  • 你能把你的测试课也展示一下吗?
  • Hi Andy 更新了问题

标签: java postgresql spring-boot flyway


【解决方案1】:

Spring Boot 正在尝试用用于测试的数据库替换您应用程序的正常数据库。但是,您已经在使用嵌入式 Postgres 的测试配置中完成了这项工作。您需要使用@AutoConfigureTestDatabase 告诉 Spring Boot 不要替换您的数据库:

@AutoConfigureTestDatabase( replace = Replace.NONE

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 2021-01-18
    • 1970-01-01
    • 2019-12-21
    • 2012-06-06
    • 1970-01-01
    • 2017-05-12
    • 2012-09-01
    • 2012-07-12
    相关资源
    最近更新 更多