Может ли один Spring PropertyPlaceholderConfigurer настроить другой? - PullRequest
0 голосов
/ 31 марта 2012

У меня есть PropertyPlaceholderConfigurer как это:

<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="locations">
        <list>
            <value>classpath:assuredlabor/margarita-${runningMode}.properties</value>
        </list>
    </property>
</bean>

Я бы хотел иметь возможность указать свой режим работы в web.xml следующим образом:

<context-param>
    <param-name>runningMode</param-name>
    <param-value>production</param-value>
</context-param>

Итак, я поместил этот bean-компонент НАВЕРХ "bean-компонент" свойства, который я описал выше:

<bean id="servletPropertyPlaceholderConfigurer" class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
</bean>

Но, похоже, это не сработает.

Возможно ли это с помощью Spring? Я сейчас использую версию 2.5.

Я нашел этот похожий вопрос:

PropertyPlaceholderConfigurer с Tomcat и ContextLoaderListener

Но обсуждение ServletContextPropertyPlaceholderConfigurer не ведется, поэтому я думаю, что это законный вопрос.

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Вы не можете сделать это весной 2, без некоторого пользовательского кодирования, я не думаю, так как один заполнитель свойства не может настроить другой.

Вам нужно использовать пружину 3, чтобы достать это из коробки.Для этого вам нужно создать bean-компонент, который каким-то образом будет иметь желаемое значение, и использовать spring-el для ссылки на эту пружину при настройке заполнителя вашего свойства.Существует специальный компонент для получения отдельных параметров контекста сервлета, как показано ниже:

<bean id="runningMode" class="org.springframework.web.context.support.ServletContextAttributeFactoryBean">
  <property name="attributeName" value="runningMode" />
</bean>

<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="locations">
        <list>
            <value>classpath:assuredlabor/margarita-#{runningMode}.properties</value>
        </list>
    </property>
</bean>

И затем вы можете просто обратиться к любому из свойств в обычном синтаксисе $ {}

1 голос
/ 31 марта 2012

Из исходного кода :

Подкласс PropertyPlaceholderConfigurer, который разрешает заполнители как параметры инициализации ServletContext (то есть записи контекстного параметра web.xml).

Может комбинироваться со значениями "location" и / или "properties" в дополнение к контекстным параметрам web.xml. Кроме того, может быть определен без локальных свойств, чтобы разрешить все заполнители как контекстные параметры web.xml (или системные свойства JVM).

Если заполнитель не может быть разрешен для предоставленных локальных свойств в приложении, этот конфигуратор будет использовать параметры ServletContext. Можно также настроить так, чтобы параметры инициализации ServletContext переопределяли локальные свойства (contextOverride = true).

Опционально поддерживает поиск атрибутов ServletContext: если этот параметр включен, то неразрешаемый заполнитель в противном случае сопоставляется с соответствующим атрибутом ServletContext, используя его строковое значение, если оно найдено. Это можно использовать для подачи динамических значений в разрешение заполнителя Spring.

Если не работает внутри WebApplicationContext (или любого другого контекста, способного удовлетворить обратный вызов ServletContextAware), этот класс будет вести себя как свойство по умолчанию PropertyPlaceholderConfigurer. Это позволяет хранить определения ServletContextPropertyPlaceholderConfigurer в наборах тестов.

Насколько я понимаю, это означает, что вы можете использовать только один конфигуратор:

<bean id="propertyPlaceholderConfigurer" class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="locations">
        <list>
            <value>classpath:assuredlabor/margarita-${runningMode}.properties</value>
        </list>
    </property>
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...