Перезагрузка @ConfigurationProperties после программного добавления активного профиля
У меня есть класс, который аннотирован @ConfigurationProperties.
@ConfigurationProperties
@Configuration
@DependsOn("AddDefaultProfile")
public class MyProperties(){
....
}
У меня есть несколько профилей, это chrome, safari, ie, and en_US, fr_CA
и т. д. Мой бегущий парам выглядит -Dspring.profiles.active=chrome, en_US
,
Теперь я хочу проверить, указан ли язык, если нет, я добавляю язык по умолчанию, используя environment.addActiveProfile("en_US")
, Проблема в том, что мои MyProperties не получают перезагрузку. Отладив его, я вижу, что в среде есть активный профиль en_US, но у propertySource все еще есть старые профили.
Как я могу сделать перезагрузку MyProperties с моим новым профилем.
2 ответа
Вы можете попробовать вызвать этот метод WebApplicationContextUtils#initServletPropertySources(org.springframework.core.env.MutablePropertySources, javax.servlet.ServletContext, javax.servlet.ServletConfig)
, но я не уверен, что это полезно
В весеннем ботинке есть среди прочего:
- application.properties (загружается в любом случае)
- application-abc.properties (загружается только если активен профиль abc)
Это исходные файлы, в которых можно найти фактические значения.
@ConfigurationProperties
однако означает, что после того, как все соответствующие файлы для загрузки найдены, как "подготовить" фактические значения ключей, которые считывает spring-boot, для использования в приложении (например, внедрение компонента, помеченного как @ConfigurationProperties
, так далее)
Итак, я думаю, вы должны положить значения по умолчанию просто application.properties
и профилировать конкретные вещи в application-<profile>.properties
Специфичные для профиля вещи всегда будут иметь приоритет над настройками по умолчанию, поэтому в итоге вы получите следующее:
- Если профиль не указан, будет загружен материал из application.properties
- Когда указан профиль, фактические значения будут загружены из
application-<profile>.properties
, несмотря на то, что тот же ключ свойства был определен в файле application.properties
Сказав, что другой способ - это всегда использовать профиль, просто определите профиль по умолчанию и загрузите его явно (--spring.profiles.active=default) и сохраните ваши вещи в application-default.properties
Если вы хотите программно определить активный профиль, проверив, что другие профили не существуют, вы можете реализовать EnvironmentPostProcessor, но это уже довольно сложный материал