Почему Spring 3.x игнорирует определенные префиксы placeholderPrefixes для PropertyPlaceholderConfigurer? - PullRequest
1 голос
/ 29 сентября 2011

У меня есть определения бина ниже. Если я изменю placeholderPrefix для bean-компонента «exposeSystemProperties» на «$ {» и использую его в пути свойств второго bean-компонента, это работает. Если я изменю его на что-либо, кроме "% {", это не сработает. Я не могу использовать любую другую строку (например, "$ sys {", "# [" и т. Д.). Я в настоящее время на 3.0.5. ВЫПУСК.

Есть мысли, почему это так? Чтобы сложить все это, у меня есть 3-й PropertyPlaceHolderConfigure, поэтому не работает только два префикса.

  <bean id="exposeSystemProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="placeholderPrefix"><value>$sys{</value></property>
    <property name="order" value="10" />
  </bean>

  <bean id="localFileProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_NEVER" />
    <property name="placeholderPrefix" value="%{" />
    <property name="placeholderSuffix" value="}" />
    <property name="order" value="20" />
    <property name="locations">
      <array>
        <bean class="java.lang.String">
            <constructor-arg><value>classpath:properties/$sys{deploy.env}/client.properties</value></constructor-arg>
        </bean>
      </array>
    </property>
  </bean>

1 Ответ

2 голосов
/ 30 сентября 2011

Поскольку префикс необходим для управления свойствами среды, это можно сделать с помощью системных переменных (вместо deploy.env свойства в вашем примере):

 <value>classpath:properties/${ENV_SYSTEM:dev}/client.properties</value>

В этом случае он всегда будет выглядеть под:

 <value>classpath:properties/dev/client.properties</value>

по умолчанию, если не установлена ​​системная переменная ENV_SYSTEM.Например, если для него установлено значение «qa», оно будет выглядеть автоматически следующим образом:

 <value>classpath:properties/qa/client.properties</value>

Другой подход, если вы готовы немного «заглянуть в будущее», - это использовать Spring 3.1 функция PROFILE , где бины могут быть специфическими для профиля.Например:

<beans profile="dev">
    <jdbc:embedded-database id="dataSource">
        <jdbc:script location="classpath:com/bank/config/sql/schema.sql"/>
        <jdbc:script location="classpath:com/bank/config/sql/test-data.sql"/>
    </jdbc:embedded-database>
</beans>

Этот dataSource будет загружен только в том случае, если для профиля установлено значение dev:

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.getEnvironment().setActiveProfiles( "dev" );
ctx.load( "classpath:/org/boom/bang/config/xml/*-config.xml" );
ctx.refresh();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...