Quarkus:用 Postgres 属性的空值覆盖 DEV 配置文件配置

Quarkus: Overwrite DEV profile config with empty values for Postgres properties

我正在使用 Quarkus (2.7.3.Final) 和 Postgres (quarkus-jdbc-postgresql)。

而且我真的很喜欢 Quarkus 的方法,如果您没有为数据源配置 usernamepasswordurl,它将尝试启动一个测试容器并模拟数据库,当您在 development mode.

中启动应用程序

因此,例如,如果您在 application.yml(或 application.properties)中定义它,当您使用 ./mvnw clean quarkus:dev 启动应用程序时,Quarkus 将为您启动一个 Postgres 测试容器:

quarkus:
  datasource:
    username:
    password:
    db-kind: postgresql
    jdbc:
      driver: org.postgresql.Driver
      url:

日志显示“Dev Services for the default datasource (postgresql) started.” 挺整洁的! :-)

然而,我真正想要的是在 application.yml 中定义我的 real/productive 数据库连接设置。然后在application-dev.yml中覆盖它们,这样只有在开发模式下才会启动testcontainer:

    quarkus:
      datasource:
        username: myuser
        password: mypassword
        db-kind: postgresql
        jdbc:
          driver: org.postgresql.Driver
          url: jdbc:postgresql://hostname:5432/mydb
    quarkus:
      datasource:
        username:
        password:
        jdbc:
          url:

但是用 null 值覆盖属性不起作用,当我在开发模式下启动应用程序时出现错误:

Datasource '<default>': Connection to hostname:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

覆盖本身有效,如果我将 application-dev.yml 更改为使用嵌入式 H2 而不是隐式测试容器,应用程序将启动:

    quarkus:
      datasource:
        username: sa
        password: mypassword
        db-kind: h2
        jdbc:
          driver: org.h2.Driver
          url: jdbc:h2:mem:mydb;DB_CLOSE_DELAY=-1

所以我的问题是:如何用空值覆盖我的数据源配置,以便 Quarkus 在开发模式下使用测试容器?

顺便说一下,不幸的是,从 application.yml 切换到 Quarkus 默认值 application.properties 没有帮助。

非常感谢!

正在关注 Quarkus' official documentation

If a profile does not define a value for a specific attribute, the default (no profile) value is used

此行为在很多情况下都很有用,但在您的情况下可能会导致无法覆盖在默认配置文件中定义的属性返回到空状态。

我建议您交换配置文件,即将 null-valued dev 配置视为默认配置,并在覆盖配置文件中提供有意义的 non-null prod 值。

如果您担心 dev 值可能会在 prod 环境中以这种方式意外使用,请记住 Quarkus is going to use prod profile by default if not told otherwise.

只是为了完成这个:结合以前的答案和评论使用 prod 配置文件这是我的解决方案:

  • application.yml DEV 设置:
    quarkus:
      datasource:
        username:
        password:
        db-kind: postgresql
        jdbc:
          driver: org.postgresql.Driver
          url:
  • application-prod.ymlPROD 设置:
    quarkus:
      datasource:
        username: myuser
        password: mypassword
        jdbc:
          url: jdbc:postgresql://hostname:5432/mydb

这样就不需要application-dev.yml了。谢谢大家! :-)