Мы используем Spring Cloud Config уже более 3 лет и хорошо понимаем порядок приоритета в свойствах конфигурации Spring между bootstrap.yml
, application.yml
, свойствами теста, переменными среды, свойствами системы и профилями Spring.По крайней мере, так было до тех пор, пока мы не столкнулись с этим вопросом сегодня.Мы используем Spring Boot 1.4.5.
У меня есть два свойства, определенные в моем application.yml
, как показано ниже:
property:
one: foobar
two: "{cipher}s0m3encRypt3dv4lu3d0td0td0t"
Если я запускаю Spring BootПриложение и распечатать значения этих двух свойств, я вижу следующее - все, как и ожидалось:
property.one=foobar
property.two=DecryptedValue
Теперь, если я попытаюсь переопределить эти два свойства через свойства системы (используя-D
или в качестве аргумента программы с --
) я вижу некоторые интересные результаты:
java -Dproperty.one=barfoo -Dproperty.two=WontWork -jar my-spring-boot-app.jar
ИЛИ
java -jar my-spring-boot-app.jar --property.one=barfoo -property.two=WontWork
При этом, когда я печатаю свойства в моем приложении, я вижу следующие значения:
property.one=barfoo
property.two=DecryptedValue
Как видите, property.one
переопределяется, как и ожидалось, но property.two
нет;последний выбрал значение из application.yml
.
Когда я перехожу к конечной точке / env моего приложения Spring Boot, я вижу, что свойства decrypted
отображаются вверху списка, что заставляет меня задуматьсячто когда я определяю зашифрованное свойство, его значение в application.yml
всегда получает приоритет над любыми попытками переопределить значение этого свойства позже .
Я не смог найти никаких ссылок на этов документации Spring Cloud Config или Spring Boot.Если кто-нибудь может сказать мне, если (1) это ошибка с возможным исправлением в более поздних версиях, и / или (2) есть способ переопределить это поведение.