Spring Boot Properties как переменные среды
Я сталкивался с некоторым поведением, которое кажется непоследовательным в том, как весенняя загрузка обрабатывает переменные среды в файлах свойств приложения против классов свойств конфигурации. Я не уверен, является ли это ошибкой весной или ошибкой в моем понимании того, что "должно произойти".
я имею
@Data
@ConfigurationProperties("foo")
@Validated
public class ClientProperties {
@NotBlank
private String apiKey;
@NotBlank
private String uri;
}
в application.properties
файл у меня есть:
foo.baseUri=https://system.appspot.com
foo.uri=${foo.baseUri}/Valuation?apikey=${foo.apiKey}&bar={bar}
Установка просто FOO_APIKEY
Если я запускаю мое приложение с:
export FOO_APIKEY=DEF
Тогда я получаю
APPLICATION FAILED TO START
***************************
Description:
Binding to target class ClientProperties(apiKey=null, uri=https://system.appspot.com/Valuation?apikey=DEF&bar={bar}) failed:
Property: foo.apiKey
Value: null
Reason: may not be empty
Обратите внимание, что в URI ключ API задан, как и ожидалось, а также базовый URI.
Установка просто FOO_API_KEY
Далее, если вместо этого я пытаюсь установить только это свойство (удалить старый env var):
export FOO_API_KEY=ABC
Затем мое приложение запускается, но значения не соответствуют ожидаемым. Мои журналы показывают:
API Key: ABC.
URI Property: ${foo.baseUri}/Insurance?apikey=${foo.apiKey}&bar={bar}.
Обратите внимание, что теперь также исчезли базовый URI и ключ API.
Установка обоих свойств FOO_API_KEY и FOO_APIKEY
Когда я устанавливаю обе переменные среды, приложение запускается, но apiKey
собственностью ClientProperties
держит значение FOO_APIKEY
экспорт, где как uri
собственностью ClientProperties
держит значение FOO_API_KEY
экспорт.
API KEY IS: ABC.
URI IS: https://system.appspot.com/Insurance?apikey=DEF&bar={bar}.
Заметки
Мне на самом деле не нужно значение от ClientProperties.apiKey
, Он используется только в приложении через ClientProperties.uri
который уже решается в application.properties
, Тем не менее, я указываю свойство, чтобы иметь возможность проверки, чтобы убедиться, что значение установлено. Я мог бы удалить значение из своего класса, и все было бы хорошо - ожидайте, тогда я потеряю свою проверку.
Весенняя загрузочная версия: 1.5.10.RELEASE