JPA依赖与Embedded PostgreSQL冲突

时间:2018-02-21 05:45:29

标签: java postgresql spring-boot spring-data-jpa windows-8.1

我有一个Spring启动应用程序,其中嵌入式PostgreSQL用于测试。

<dependency>
   <groupId>ru.yandex.qatools.embed</groupId>
   <artifactId>postgresql-embedded</artifactId>
   <version>2.6</version>
   <scope>test</scope>
</dependency>

我正在使用常规的非嵌入式PostgreSQL,然后进行测试。

<dependency>
   <groupId>org.postgresql</groupId>
   <artifactId>postgresql</artifactId>
   <version>42.1.4</version>
</dependency>

我现在必须使用JPA依赖和PostgreSQL。

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

到目前为止一直很好,但问题是,只要我使用JPA依赖项,我的测试就会开始失败。当我删除JPA依赖项时,测试开始再次运行。我已经调查并发现,当我不使用JPA依赖时,嵌入式PostgreSQL二进制文件将被提取并正确运行并带有消息,

Extract C:\Users\Dev\.embedpostgresql\postgresql-10.1-2-windows-x64-binaries.zip START

在上面的消息之后启动了Flyway迁移但是当使用JPA依赖项时,上面的消息没有显示,因此嵌入式PostgreSQL没有启动,并且启动了Flyway迁移,最终因为没有服务器运行而失败。

这是嵌入式PostgreSQL的JPA依赖的已知问题吗?我试图在网上搜索这样的问题,但找不到任何关于它的东西,我还不是Spring引导的专家(

)。

嵌入式PostgreSQL配置类:

import com.myproj.microservice.config.DatasourceConfig;
import groovy.util.logging.Slf4j
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.autoconfigure.AutoConfigureBefore
import org.springframework.context.annotation.Configuration
import ru.yandex.qatools.embed.postgresql.EmbeddedPostgres

import javax.annotation.PostConstruct
import javax.annotation.PreDestroy
import java.sql.Connection
import java.sql.DriverManager

@Configuration
@AutoConfigureBefore(DatasourceConfig.class)
@Slf4j
class EmbeddedPostgresConfig {

  private final EmbeddedPostgres postgres = new EmbeddedPostgres()

  @PostConstruct
  void startAndSetupEmbeddedPostgresql() {

    log.debug("Starting Embedded PostqreSQL")

    String url = postgres.start('localhost', 1234, 'testDB', 'testUser', 'testUser')

    Connection conn = null
    try {
      // TODO from db init script?
      conn = DriverManager.getConnection(url)
      conn.createStatement().execute("""CREATE SCHEMA "myDB" AUTHORIZATION "testUser";""")
      conn.createStatement().execute("""GRANT ALL ON SCHEMA "myDB" TO "testUser";""")
    } finally {
      conn?.close()
    }
  }

  @PreDestroy
  void stopEmbeddedPostgresql() {
    postgres.stop()
  }

}

0 个答案:

没有答案