Настройка резольвера системных свойств Spring: - PullRequest
0 голосов
/ 19 мая 2018

Я работаю над проектом, который требует, чтобы я взял переменные окружения или системные свойства в приложении Java Spring и изменил их, прежде чем они будут внедрены в bean-компоненты.Шаг модификации является ключевым для работы этого приложения.

Мой текущий подход к этому состоит в том, чтобы установить переменные в качестве системных переменных среды, а затем использовать настраиваемый конфигуратор-заполнитель для доступа к вышеупомянутым переменным и создания из них новых свойств, которыебобы могут получить доступ.Существует идеальное учебное пособие для этого (за исключением того, что оно использует базы данных).

У меня есть POC, использующий этот подход, работающий нормально, но я думаю, что там может быть более простое решение.Возможно, существует подход, позволяющий расширить стандартный конфигуратор-заполнитель, чтобы «зацепить» пользовательский код для внесения необходимых изменений для всех свойств всего приложения.Может быть, есть способ запустить код сразу после сбора свойств и до того, как данные будут введены в bean-компоненты.

Предоставляет ли пружина более простой способ сделать это?Спасибо за ваше время

1 Ответ

0 голосов
/ 01 июня 2018

Проще говоря, самый простой способ сделать это - следовать указаниям в разделе «Управление источниками свойств в веб-приложении» в весенней документации по управлению свойствами .

ВВ конце вы ссылаетесь на пользовательский класс из web.xml через тег context-param:

<context-param>
   <param-name>contextInitializerClasses</param-name>
   <param-value>com.some.something.PropertyResolver</param-value>
</context-param>

Это заставляет Spring загружать этот код перед инициализацией любого bean-компонента.Тогда ваш класс может сделать что-то вроде этого:

public class PropertyResolver implements ApplicationContextInitializer<ConfigurableWebApplicationContext>{

    @Override
    public void initialize(ConfigurableWebApplicationContext ctx) {
        Map<String, Object> modifiedValues = new HashMap<>();
        MutablePropertySources propertySources = ctx.getEnvironment().getPropertySources();
        propertySources.forEach(propertySource -> {
            String propertySourceName = propertySource.getName();
            if (propertySource instanceof MapPropertySource) {
                Arrays.stream(((EnumerablePropertySource) propertySource).getPropertyNames())
                      .forEach(propName -> {
                          String propValue = (String) propertySource.getProperty(propName);
                          // do something
                      });
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...