我正在尝试设置Spring Boot以使用多个数据源。我已经按照instructions设置了两个数据源并将其中一个设置为主数据。
@Configuration
@EnableJpaRepositories(basePackages={"my.postgres.repositories"}
entityManagerFactoryRef="postgresEntitymanager"
transactionManagerRef="postgresTransactionManager")
public class PgConfig {
@Primary
@Bean(name="postgresDS")
@ConfigurationProperties(prefix="spring.datasource.postgres")
public DataSource postgresDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name="postgresEntityManager")
public LocalContainerEntityManagerFactoryBean postgresEntityManager(EntityManagerFactoryBuilder builder) {
return builder.dataSource(postgresDataSource())
.packages("my.postgres.domain")
.persistenceUnit("postgresPersistenceUnit")
.build();
}
@Primary
@Bean(name = "postgresTransactionManager")
public PlatformTransactionManager postgresTransactionManager(
@Qualifier("postgresEntityManager") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
我有一个oracle的第二个配置类,缺少@Primary注释,但非常相似。我还将此添加到我的主类中以排除数据源自动配置。
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
我遇到的问题是这个设置不允许我的针对H2数据库运行的集成测试打开连接......
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Could not open connection
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Could not open connection
Caused by: org.hibernate.exception.JDBCConnectionException: Could not open connection
Caused by: java.sql.SQLException: The url cannot be null
我在src / integrationtest / resources下使用单独的application.properties文件,其中包含
spring.jpa.database=H2
如何让我的集成测试使用H2作为我在运行测试时使用的存储库?
如果我不包含我的自定义数据源,一切似乎都能正常工作。
由于
答案 0 :(得分:0)
您可以使用h2
数据库添加自己的测试配置,但在生产中使用其他数据库。您已在Spring应用程序类中排除DataSourceAutoConfiguration
,但它在集成测试中很有用。
一个简单的解决方案是仅为您的集成测试使用不同的spring应用程序类,而不排除DataSourceAutoConfiguration
或仅实现您自己的DataSourceAutoConfiguration
并启用它。您可以决定在自己的实施中何时启用或启用自己的DataSourceAutoConfiguration
。例如,如果junit
中存在spring-test
或classpath
,则会启用它,否则将被禁用。这要求junit
或spring-test
不会包含在生产中,这可以由依赖管理(如maven)处理。