Дополнительное переопределение PropertySource по умолчанию с помощью файла свойств с именем переменной

У меня есть проект Serenity-BDD на IntelliJ с Serenity-Spring и несколькими файлами .properties, по одному для отображения каждой среды развертывания (dev, qa, production), с базовым файлом .properties, который содержит переменные для localhost.

test.properties
test-dev.properties
test-qa.properties
test-prod.properties

Я передаю аргумент в моей команде CLI (-Denvironment), чтобы выбрать файл .properties, который переопределит базу.

./gradlew build -Denvironment

В моем @PropertiesSource указаны оба файла с переменной среды для файла переопределения:

@PropertySource(value = {"test.properties", "test-${environment}.properties"}, ignoreResourceNotFound = true)

Однако, когда я запускаю это локально через IntelliJ (что означает отсутствие переменной -Denvironment, что означает localhost и требуется только файл test.properties), я получаю следующую ошибку в своем выводе:

ИНФОРМАЦИЯ: расположение свойств [test-${environment}.properties] не разрешимо: не удалось разрешить заполнитель «среда» в значении «test-${environment}.properties»

Что именно это за ошибка, и как лучше всего ее решить?


person as.beaulieu    schedule 18.09.2018    source источник


Ответы (1)


Поскольку вы жестко запрограммировали тот факт, что загружаются два файла свойств, я бы использовал механизм значений Spring SpEL по умолчанию:

@PropertySource(value = {"test.properties", "test-${environment:local}.properties"})

Таким образом, когда среда недоступна, Spring загрузит test.properties и test-local.properties.

Это нормально, что у вас есть ошибка [test-${environment}.properties] неразрешимая, поскольку заполнители разрешаются до загрузки PropertySources (что логично, если подумать).

Кроме того, ignoreResourceNotFound = true подвержен ошибкам, и я не рекомендую использовать его в рабочем коде.

Если бы вы использовали только один файл, вы могли бы использовать

@PropertySource("${environment:local}.properties")

Это то, что будет загружено Spring:

  • => локальные.свойства
  • -Denvironment=uat => uat.properties
  • -Denvironment=prod => prod.properties
person Loïc Le Doyen    schedule 18.09.2018
comment
Спасибо за подтверждение того, что ignoreResourceNotFound подвержен ошибкам; Я не думал, что это работает. Есть ли лучшая альтернатива? Поскольку test.properties технически является моим локальным файлом свойств, есть ли способ игнорировать второй файл, если среда не предоставлена? Или я могу переименовать свои test.properties в local.properties, полностью удалить test- и снова переопределить local.properties с помощью local.properties, когда среда не будет предоставлена? - person as.beaulieu; 18.09.2018
comment
Да, вы можете окончательно использовать только один файл и указать его имя по умолчанию: @PropertySource(value = "${environment:test}.properties") - person Loïc Le Doyen; 19.09.2018
comment
@ as.bealieu Если вы считаете, что этот ответ подходит для вашей проблемы, отметьте его как таковой. Заранее спасибо. - person Loïc Le Doyen; 26.09.2018