我在带有 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
这也会将其发送为空。 看来它已经死心塌地地忽略了任何外部属性,而且我在网上找不到任何有效的线程。有谁知道为什么会发生这种情况?
在将值实际注入变量之前,会先评估构造函数。
声明一个控制器,可以看到值设置正确:
@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;
}
}