А что, если я скажу, что подобное
#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 и других интерпретаторах, которые не допускают переменных, содержащих символ точки и/или символ дефиса. Также допускается вариация имён в верхнем регистре для более идиоматического для оболочки представления.
А чё так можно было что ли?
Подробное описание возможностей легко найти на эльфийских просторах интернета. Оставлю небольшую выдержку, что ещё уже давно можно взять на вооружение.
- Случайные значения:
#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=
Будет прекрасно работать, без необходимости явно описывать переменные окружения в значениях свойства.
ссылка на оригинал статьи https://habr.com/ru/articles/588985/
Добавить комментарий