为 Postgres 设置的 Flyway 的 BeanCreationException
BeanCreationException for Flyway set up for Postgres
当我尝试构建存储库模块时,我收到了 Flyway 配置的 BeanCreationException。尝试了多种方法,但没有运气。有人可以帮我解决这个问题吗?
错误:
启动 ApplicationContext 时出错。要显示自动配置报告,请重新 运行 您的应用程序并启用 'debug'。
2019-03-21 06:11:15.404 ERROR 13480 --- [main] o.s.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 的替换属性。
测试配置Class:
@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 的片段
<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>
测试Class:
@RunWith(SpringRunner.class)
@DataJpaTest
@ContextConfiguration(classes = TestConfig.class)
public class InsuranceRepositoryTest {
---//Test methods
}
Spring Boot 正在尝试用一个用于测试的数据库替换您应用程序的普通数据库。但是,您已经在使用嵌入式 Postgres 的测试配置中完成了该操作。您需要使用 @AutoConfigureTestDatabase
告诉 Spring Boot 不要替换您的数据库:
@AutoConfigureTestDatabase( replace = Replace.NONE
当我尝试构建存储库模块时,我收到了 Flyway 配置的 BeanCreationException。尝试了多种方法,但没有运气。有人可以帮我解决这个问题吗?
错误:
启动 ApplicationContext 时出错。要显示自动配置报告,请重新 运行 您的应用程序并启用 'debug'。 2019-03-21 06:11:15.404 ERROR 13480 --- [main] o.s.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 的替换属性。
测试配置Class:
@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 的片段
<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>
测试Class:
@RunWith(SpringRunner.class)
@DataJpaTest
@ContextConfiguration(classes = TestConfig.class)
public class InsuranceRepositoryTest {
---//Test methods
}
Spring Boot 正在尝试用一个用于测试的数据库替换您应用程序的普通数据库。但是,您已经在使用嵌入式 Postgres 的测试配置中完成了该操作。您需要使用 @AutoConfigureTestDatabase
告诉 Spring Boot 不要替换您的数据库:
@AutoConfigureTestDatabase( replace = Replace.NONE