Возможно ли иметь несколько PropertyPlaceHolderConfigurer в моем applicationContext?


Мне нужно загрузить определенный applicationContext.xml-файл в соответствии с заданным системным свойством. Это само загружает файл с фактической конфигурацией. Поэтому мне нужно 2 PropertyPlaceHolderConfigurer, один из которых разрешает системный параметр, а другой-в фактической конфигурации.

есть идеи, как это сделать?

8 51

8 ответов:

Да, вы можете сделать больше, чем один. Будьте уверены, чтобы установить ignoreUnresolvablePlaceholders Так что первый будет игнорировать любые заполнители, которые она не может решить.

<bean id="ppConfig1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="ignoreUnresolvablePlaceholders" value="true"/>
   <property name="locations">
    <list>
             <value>classpath*:/my.properties</value>
    </list>
  </property>
</bean>

<bean id="ppConfig2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="ignoreUnresolvablePlaceholders" value="false"/>
   <property name="locations">
    <list>
             <value>classpath*:/myOther.properties</value>
    </list>
  </property>
</bean>

в зависимости от вашего приложения вы должны исследовать systemPropertiesMode, он позволяет загружать свойства из файла, но позволяет свойствам системы переопределять значения в файле свойств, если они установлены.

остерегайтесь -- там может быть ошибка, связанная с несколькими конфигураторами. См.http://jira.spring.io/browse/SPR-5719 для более подробной информации.

Я не могу получить несколько для работы локально... но я пока никого не виню, кроме себя.

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

<bean id="mySecondConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="classpath:/myprops.properties" 
        p:placeholderPrefix="myprefix-"/>

<bean class="com.mycompany.MyClass" p:myprop="${myprefix-value.from.myprops}"/>

вы не можете сделать это напрямую, и эта проблема JIRA от Spring объясняет, почему (проверьте комментарий от Chris Beams для подробного объяснения):

https://jira.springsource.org/browse/SPR-6428

однако он предоставляет обходной путь с помощью Spring 3.1 или более поздней версии, который должен использовать класс PropertySourcesPlaceholderConfigurer вместо класса PropertyPlaceholderConfigurer.

вы можете скачать проект на основе Maven, который демонстрирует проблема и решение из весеннего фреймворка вопросов github:

https://github.com/SpringSource/spring-framework-issues

найдите номер проблемы, SPR-6428, в загруженных проектах.

на моей стороне, играя с PropertyPlaceholderConfigurer оба свойства:

  • порядок (должен быть ниже для первого доступа / разбора КПП)
  • ignoreUnresolvablePlaceholders ("false "для первого доступного/проанализированного PPC," true " для следующего)

  • а также дать 2 различных идентификаторов для обоих КПП (чтобы избежать одного быть перезаписаны другим)

работает отлично

надеюсь, это поможет

у нас работает следующий подход:

<util:properties id="defaultProperties">
    <prop key="stand.name">DEV</prop>
    <prop key="host">localhost</prop>
</util:properties>
<context:property-placeholder 
    location="file:${app.properties.path:app.properties}" 
    properties-ref="defaultProperties"/>

системное свойство app.properties.path может использоваться для переопределения пути к файлу конфигурации.

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

просто давая 2 различных идентификаторов работал для меня. Я использую spring 3.0.4.

надеюсь, что это поможет.

в случае, вам нужно определить два КПП (как в моей ситуации) и использовать их независимо. Установив свойство placeholderPrefix, вы можете получить значения из нужного PPC. Это будет удобно, когда оба набора свойств PPC имеют одинаковые ключи, и если вы не используете это свойство ppc2 переопределит ppc1.

определение xml:

<bean name="ppc1"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="properties" ref="ref to your props1" />
        <property name="placeholderPrefix" value="$prefix1-{" />
    </bean>
<bean name="ppc2"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="properties" ref="ref to your props2" />
        <property name="placeholderPrefix" value="$prefix2-{" />
    </bean>

извлечение во время выполнения:

@Value(value = "$prefix1-{name}")
private String myPropValue1;

@Value(value = "$prefix2-{name}")
private String myPropValue2;