Невозможно прочитать внешние свойства при весенней загрузке 3

У меня есть проект 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

Это также отправляет его как ноль. Кажется, он категорически настроен игнорировать любые внешние свойства, и я не смог найти в Интернете ни одной подходящей темы, которая работала бы. Кто-нибудь знает, почему это может происходить?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Конструктор оценивается до того, как значение будет фактически введено в переменную.

Объявите контроллер, и вы увидите, что значение установлено правильно:

    @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;
    }
}

спасибо, это действительно сработало, я полагаю, следовало уделить больше внимания жизненному циклу компонентов. Это подводит меня к продолжению. На самом деле я пытался установить URL-адрес источника данных Spring, имя пользователя и пароль, используя эти переменные env в файле application.properties, но это отображалось как нулевое. Именно тогда я попробовал все вышеперечисленное и застрял. Разве источник данных не предназначен для такой настройки?

Ironscar 11.04.2024 16:29

да, должно работать так же, как указано выше

Mihai 11.04.2024 16:36

Я имею в виду, что я напрямую пытался установить spring.datasource.url, spring.datasource.username и spring.datasource.password в реквизитах приложения, используя переменные env, но запуск jar не удался, говоря, что URL-адрес должен начинаться с jdbc (игнорируя переменную env для URL-адреса, который на самом деле начинается с jdbc)

Ironscar 12.04.2024 05:05

Другие вопросы по теме