Перезагрузка @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, но это уже довольно сложный материал

Другие вопросы по тегам