
А что, если я скажу, что подобное
#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=
Будет прекрасно работать, без необходимости явно описывать переменные окружения в значениях свойства.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
А как вы определяете свойства переменными окружения в Spring Boot приложениях?
25% Знаю о возможности, всё равно указываю свойства переменными окружения явно21
30.95% Знаю о возможности, практикую26
10.71% Не знал о возможности, осуждаю9
33.33% Не знал о возможности, запомню28
Проголосовали 84 пользователя. Воздержались 12 пользователей.