Spring Boot 3中无法读取外部属性

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

我在带有 JDK 17 和 Alpine JDK 17 docker 容器的 Windows 计算机上有一个 Spring Boot 3.1.0 项目 它有一个控制器,如下所示:

@RestController
@RequestMapping("/api")
public class ApiController {

    @Value("${app_sql_db_user}")
    String user;

    public ApiController() {
        log.info("user = {}", user);
    }
}

此属性未在 application.properties 中定义,因此我希望它能够从我添加它的环境变量中获取它。在 Windows 中,我尝试将其添加到用户变量和系统变量中。在 Docker 中,我使用了

-e
标志。

以上都不起作用,并将 user 打印为 null。此时,我在 application.properties 中添加了一个新属性:

app.sql.db.user=${app_sql_db_user}

这也不能解决问题。 我尝试将它们作为 JVM 参数传递

java -Dapp_sql_db_user=springapp -jar target/app.war

这也会将其发送为空。 看来它已经死心塌地地忽略了任何外部属性,而且我在网上找不到任何有效的线程。有谁知道为什么会发生这种情况?

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

在将值实际注入变量之前,会先评估构造函数。

声明一个控制器,可以看到值设置正确:

    @GetMapping("/")
    String all() {
        return "user: " + user;
    }

如果您希望变量在构造函数中可用,您需要将其声明为构造函数的参数:

@RestController
@RequestMapping("/api")
public class ApiController {

    
    String user;

    public ApiController(@Value("${app_sql_db_user}") final String usr) {
        user = usr;
        log.info("user = {}", user);
    }

    @GetMapping("/")
    String all() {
        return "user: " + user;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.