У меня есть проект Spring Boot 3.1.0 на машине Windows с JDK 17 и док-контейнером Alpine JDK 17. У него есть контроллер, который выглядит примерно так:
@RestController
@RequestMapping("/api")
public class ApiController {
@Value("${app_sql_db_user}")
String user;
public ApiController() {
log.info("user = {}", user);
}
}
Это свойство не определено в application.properties, поэтому я ожидаю, что оно сможет получить его из переменных среды, куда я его добавил. В Windows я пробовал добавить его как в пользовательскую, так и в системную переменную. В Docker я использовал флаг -e
.
Ничто из вышеперечисленного не помогло, и пользователь печатается как нулевой. В этот момент я добавил новое свойство в свой 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;
}
}
да, должно работать так же, как указано выше
Я имею в виду, что я напрямую пытался установить spring.datasource.url
, spring.datasource.username
и spring.datasource.password
в реквизитах приложения, используя переменные env, но запуск jar не удался, говоря, что URL-адрес должен начинаться с jdbc (игнорируя переменную env для URL-адреса, который на самом деле начинается с jdbc)
спасибо, это действительно сработало, я полагаю, следовало уделить больше внимания жизненному циклу компонентов. Это подводит меня к продолжению. На самом деле я пытался установить URL-адрес источника данных Spring, имя пользователя и пароль, используя эти переменные env в файле application.properties, но это отображалось как нулевое. Именно тогда я попробовал все вышеперечисленное и застрял. Разве источник данных не предназначен для такой настройки?