如何在 Spring Boot 应用程序中从项目根目录正确访问 application.yml 中的环境变量?

问题描述 投票:0回答:1

我正在尝试为 Spring Boot 3 中的服务设置 Postgres,但我无法让环境变量正常工作。

对数据库属性进行硬编码可以正常工作,如下所示。

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/abc-shop
    username: postgres
    password: postgres

但是使用以下命令会出现错误。

spring:
  datasource:
    url: jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
    username: ${POSTGRES_USER}
    password: ${POSTGRES_PASSWORD}
java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}

我在项目根目录的 .env 文件中有环境变量,我也传递它们 来自 docker-compose 文件。

这是 .env 文件 -

POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=abc-shop
POSTGRES_HOST=localhost
POSTGRES_PORT=5432

这是 docker-compose -

version: '3.8'

services:
  postgres:
    image: postgres:latest
    container_name: postgress_db
    restart: always
    environment:
      POSTGRES_HOST: ${POSTGRES_HOST}
      POSTGRES_PORT: ${POSTGRES_PORT}
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

我检查了本地计算机中的 postgres 容器内部,并且环境变量存在于其中。 Spring 似乎无法读取它们。此外,在之前的项目中,我让它在生产环境中像这样工作,我在 GitHub Actions 秘密中拥有环境变量。

此外,很明显,在开发环境中对值进行硬编码并不重要,我也知道这一点,我只是想知道为什么这不起作用。

如果您需要更多信息,请告诉我,谢谢!

java postgresql spring-boot docker-compose environment-variables
1个回答
0
投票

您的定义和用法之间似乎存在一些差异。您发布的

compose.yaml
使用正确的(!)变量启动 PostgreSQL 容器。您自己也说过,在 Spring 应用程序中“对值进行硬编码”是可行的。

但是,您还没有说明您的应用程序是如何启动的。如果这行得通,您需要将相同的变量传递给执行它的 JVM。简而言之,您已经表明您已使主机/数据库/凭据的“接收者”接受这些内容。不要忘记让“发送者”(即充当 PostgreSQL 服务器客户端的 Spring 应用程序)“知道”相同的信息!事实上,异常显示

${...}
部分未插值,这似乎表明执行 Java 代码的进程缺少环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.