Проблема в Spring Boot со слиянием списков в yml
Коллеги, помогите, пожалуйста. Наш продуктовый конфиг хранится в yml-файлах. У нас есть два профиля Spring, business and custom.
Продуктовый конфиг содержит продуктовые константы (briefCode, systemId и другие).
Профиль business — часть приложения, общая для всех сред разворачивания (local, development, test и production).
Профиль custom используется только на стенде тестирования (test, предпрод) нашими тестировщиками для дополнения профиля business некоторыми особенностями окружения test.
И вот в чём проблема. Допустим, это фрагмент application-business.yml (вшитого в каждую сборку):
PRODUCT_CODE1:
- { name: briefCode, value: '0001' }
- { name: systemId, value: ABC }
а это фрагмент application-custom.yml (присутствующего только в окружении test, на котором не заведены наши логины и приходится хардкодить, перебивая реальное свойство продукта взятым из конфига):
PRODUCT_CODE1:
- { name: login, value: hardcodedLogin }
И при такой настройке в окончательную конфигурацию продуктовых свойств в окружении test попадает только свойство login.
Соответственно, мне приходится дублировать поля briefCode и systemId и в application-custom.yml
Но тогда, если в какой-то момент systemId продукта PRODUCT_CODE1 в application-business.yml сменится, скажем, на BCD, то в окружении test возникнет несоответствие, так как итоговая конфигурация будет содержать устаревшее значение systemId=ABC.
Это и есть моя проблема с дублированием содержимого списков, которые невозможно слить.
Мой другой подход к решению проблемы заключался в использовании Map<String, ?> вместо List<?>.
Но я столкнулся с другой проблемой (не менее контринтуитивной, чем первая): названия некоторых продуктовых свойств начинаются с двух решёток (##), а некоторые содержат точку (.).
И Spring читает их очень странно.
PRODUCT_CODE1:
'##key1': value1
"##key2': value2
'k.e.y3': value3
"k.e.y4": value4
И вот полученный в Spring Map для PRODUCT_CODE1: key1=value1, key2=value2.
Восхитительно! Решётки обрезаны. Свойства с точками в названии просто пропущены.
И это несмотря на одинарные и двойные кавычки!
Есть другие способы решения проблемы, о которых я, возможно, ещё не задумывался?
Я что-то упускаю? Или делаю что-то не так?
Пожалуйста, направьте меня.
Заранее спасибо!
С уважением, L.B.
P.S. На английском S&O мне уже указали в комментарии, что это плохой дизайн, yml-конфиг только для технических настроек.
Но мы вынуждены использовать его с такой целью, так как бизнесу нужна возможность в случае необходимости экстренно поменять ту или иную продуктовую константу без пересборки, поэтому хардкод в коде здесь не применим.
А так как у нас stateless приложение, то и в базе хранить не вариант.