Pull to refresh

А как вы определяете свойства переменными окружения в Spring Boot приложениях?

Reading time2 min
Views11K
image

А что, если я скажу, что подобное

#application.properties
spring.datasource.url=${SPRING_DATASOURCE_URL}?someProperty=${PROPERTY}

содержит ошибку. Не согласны? Разбор под катом.

Жили и не тужили


Как часто работая с проектом, аккуратно завёрнутым в Docker и CI, вам доводилось видеть нечто такое:

#application.properties
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
spring.datasource.driver-class-name=org.postgresql.Driver

Решение довольно прозрачно, чтобы определить свойства нашего модуля, зададим им значения из переменных окружения, которые наш CI даст определить для каждой среды своими значениями.

Сюрприз


В нашем разнообразном мире сотни самописных микросервисов и разнородных команд, не задаваясь вопросами, копируя решения из одного проекта в другой, потребовалось немного отойти от привычного состава

#application.properties
spring.datasource.url=${SPRING_DATASOURCE_URL}?someProperty=${PROPERTY}

Переменные окружения проинициализированны, приложение работает с заданным URL, но наше свойство не проставляется.

Расследование


Оказывается уже с версии 3.1 Spring использует переменные окружения как источник свойств, а чтобы нам их можно было определить в bash привычным образом, любезно учитывает верхний регистр и знак подчёркивания вместо точки.

Выдержка из реализации источника свойств Spring приложений, класса SystemEnvironmentPropertySource, в вольном переводе автора:
Спецификация источника, определяющего свойства из системных переменных среды. Для компенсации ограничений в Bash и других интерпретаторах, которые не допускают переменных, содержащих символ точки и/или символ дефиса. Также допускается вариация имён в верхнем регистре для более идиоматического для оболочки представления.

Оригинальный текст
Specialization of MapPropertySource designed for use with system environment variables. Compensates for constraints in Bash and other shells that do not allow for variables containing the period character and/or hyphen character; also allows for uppercase variations on property names for more idiomatic shell use.

А чё так можно было что ли?


Подробное описание возможностей легко найти на эльфийских просторах интернета. Оставлю небольшую выдержку, что ещё уже давно можно взять на вооружение.

  • Случайные значения:

    #application.properties
    random.number=${random.int}
    random.long=${random.long}
    random.uuid=${random.uuid}
    

  • Значение по умолчанию и/или короткое имя:

    #application.properties
    server.port=${port:8080}
    

  • В дополнение к application.properties возможность переопределить часть переменных для приложения запущенного с некоторым профилем myprofile в дополнительном файле application-myprofile.properties

За большим материалом не поленитесь прочитать документацию.

Заключение


Знай свой инструмент и не занимайся суеверным программированием делая так, потому что твои дедысиньёры так делали.

#bash
export SPRING_DATASOURCE_URL=jdbc:postgresql://localhost/test?environmentDependencyProperty=value

#application.properties
spring.datasource.url=

Будет прекрасно работать, без необходимости явно описывать переменные окружения в значениях свойства.
Only registered users can participate in poll. Log in, please.
А как вы определяете свойства переменными окружения в Spring Boot приложениях?
25% Знаю о возможности, всё равно указываю свойства переменными окружения явно20
30% Знаю о возможности, практикую24
11.25% Не знал о возможности, осуждаю9
33.75% Не знал о возможности, запомню27
80 users voted. 12 users abstained.
Tags:
Hubs:
+3
Comments11

Articles

Change theme settings