Загрузка свойств из пользовательских файлов в зависимости от активного профиля - PullRequest
1 голос
/ 10 октября 2019

У меня есть приложение с новейшей версией SpringBoot v.2.1.9. Проект содержит несколько пользовательских файлов со следующим шаблоном:

  • file1-dev.properties
  • file1-prod.properties
  • file2-dev.properties
  • file2-prod.properties и т. Д.

Я хочу достичь аналогичного поведения для приложения Spring - {profile} .properties, я имею в виду загрузку каждого пользовательского реквизита из файла, который соответствуетв активный профиль. Из-за огромного количества свойств я не могу хранить их в application- {profile} .properties, потому что это вызывает проблемы с читабельностью.

Я бы хотел найти строго Java-решение, без каких-либо обходных путей Maven с физической заменой файлов после сборки. Не могли бы вы посоветовать мне, как я могу достичь такого подхода?

Мое текущее предположение - переопределить метод инициализации из ApplicationContextInitializer, затем проверить профиль и выполнить логику для выбора файлов, однако я не уверен, что это наиболее эффективный подход.

Многиезаранее спасибо за помощь.

@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
    String profile = System.getProperty("spring.profiles.active");
    //selecting files according to active profile
    applicationContext.getEnvironment().getPropertySources().addLast(prop);
}

1 Ответ

1 голос
/ 14 октября 2019

Я уже решил свою проблему. Если у кого-то возникнут такие же проблемы, пожалуйста, найдите мое решение ниже:

1) Реализуйте EnvironmentPostProcessor и переопределите метод postProcessEnvironment.

2) Получите файлы из ресурсов -> Я использовал PathMatchingResourcePatternResolverкласс из пакета org.springframework.core.io.support. Как только мы передадим экземпляр ClassLoader, мы сможем выполнить метод getResources (String path).

3) Выполнить итерацию по массиву Resource [] и выбрать тех, кто удовлетворяет вашим потребностям

4) Создать PropertiesPropertySourceLoaderэкземпляр и загрузить свойства из пути ресурса.

@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
    Resource[] resources = getResources("classpath*:/properties/*.*");
    List<List<PropertySource<?>>> propertySources = getPropertySources(resources);
    for (int i = 0; i < propertySources.size(); i++) {
        propertySources.get(i).forEach(propertySource -> environment.getPropertySources().addLast(propertySource));
    }
    application.setEnvironment(environment);
}

private Resource[] getResources(String path) {
    ClassLoader classLoader = this.getClass().getClassLoader();
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classLoader);
    try {
        return resolver.getResources(path);
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to load props configuration " + ex);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...