Использование Spring Integration SpEl внутри тега значения

Я пытаюсь установить файл свойств внутри класса, который расширяет PropertyPlaceholderConfigurer на основе среды (local, dev, ref, qa, prod)

Моя структура папок выглядит следующим образом.

properties
   environment.properties
   server-local.properties
   server-ref.properties
   server-prod.properties
   email-local.properties
   email-ref.properties
   email-prod.properties
   cache-local.properties
   cache-ref.properties
   cache-prod.properties

В environment.properties есть свойство

environment.stage=local  (or whatever env this is)

Мои операторы контекста Spring Integration выглядят примерно так:

<context:property-placeholder location="classpath:properties/*.properties" />

<bean id="propertyPlaceholder" class="com.turner.bvi.BviPropertiesUtil">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="locations">
        <list>
            <value>classpath:properties/environment.properties</value>
            <value>classpath:properties/*-${environment.stage}.properties</value>
        </list>
    </property>

</bean>

Что я хочу сделать, так это иметь только файл свойств из конкретной загрузки этапа среды (будь то локальный, ref, prod .... и т. д.). Как мне получить только этот второй набор файлов свойств для загрузки на основе environment.stage?

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


person Stephen McConnell    schedule 26.08.2014    source источник
comment
Это веб-приложение? Если вы используете сервер приложений, такой как Tomcat, вы можете установить environment.stage в качестве переменной среды и прочитать значение, чтобы определить, какой файл свойств выбрать. Следующая ссылка должна быть полезна для демонстрации методов чтения переменных среды с помощью Spring: как читать системную переменную среды в Spring applicationContext   -  person M7Jacks    schedule 27.08.2014
comment
Нет, это не веб-приложение. Я пытаюсь получить эти файлы свойств, относящиеся к конкретной среде. Получение переменной environment.stage не проблема. Это хорошо работает. Получение файлов, в имени которых есть эта среда.stage, является проблемой. :( Я пытаюсь использовать оператор *-${environment.stage}, чтобы попробовать это. Я ПОЛНОСТЬЮ на неправильном пути? Spring не может разрешить этот путь. Возможно, использование этого в теге ‹value›‹/value› не т работать.   -  person Stephen McConnell    schedule 27.08.2014
comment
Прочитав опубликованную вами статью, я думаю, что смогу создать тег свойств утилиты в контексте, а затем использовать ссылку в качестве ссылки на этот идентификатор... Сейчас попробую.   -  person Stephen McConnell    schedule 27.08.2014


Ответы (2)


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

<context:property-placeholder location="classpath:properties/*.properties" />
<beans profile="local">

    <bean id="propertyPlaceholder" class="com.turner.bvi.BviPropertiesUtil">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="locations">
            <list>
                <value>classpath:properties/environment.properties</value>
                <value>classpath:properties/*-local.properties</value>
            </list>
        </property>
    </bean>
</beans>

<beans profile="dev">
    <bean id="propertyPlaceholder" class="com.turner.bvi.BviPropertiesUtil">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="locations">
            <list>
                <value>classpath:properties/environment.properties</value>
                <value>classpath:properties/*-local.properties</value>
            </list>
        </property>
    </bean>
</beans>
...

Задать переменную окружения можно с помощью spring_profiles_active (или spring_profiles_default). В Unix попробуйте экспортировать SPRING_PROFILES_DEFAULT=local

В качестве альтернативы вы можете использовать параметры JVM, такие как -Dspring.profiles.active=local

Если вам нужно сохранить переменные среды такими, какие они есть, вы можете реализовать собственный ActiveProfilesResolver, как описано здесь: Профили Spring: простой пример ActiveProfilesResolver?

person Adrian Lopez    schedule 27.08.2014
comment
Большое тебе спасибо. Это хорошее решение, но я также смог достичь цели, используя переменные среды, установленные через Chef, или создав контейнер Docker с переменными среды в нем. Смотрите сообщение ниже. - person Stephen McConnell; 27.08.2014

Спасибо за вашу помощь. Я смог взять фрагменты всех ваших предложений и найти решение, используя «environmentProperties» в контексте Spring.

Проблема с попыткой использовать a в контексте заключалась в том, что он не был установлен в то время, когда МОЙ класс пытался разрешить ${environment.stage}... Или, по крайней мере, это то, что я понял из поиска других сообщений.

Если моя файловая структура свойств выглядит так:

properties
   environment.properties
   server-local.properties
   server-ref.properties
   server-prod.properties
   email-local.properties
   email-ref.properties
   email-prod.properties
   cache-local.properties
   cache-ref.properties
   cache-prod.properties

Мне удалось установить для свойства Environment «env» правильное значение через Chef или через контейнер Docker и использовать следующий код.

<!-- Register the properties file location -->
<context:property-placeholder location="classpath:properties/*.properties" />

<bean id="propertyPlaceholder" class="com.turner.bvi.BviPropertiesUtil">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="locations">
       <list>
           <value>classpath:properties/environment.properties</value>
           <value>classpath:properties/*-#{systemEnvironment['env']}.properties</value>
       </list>
    </property>
</bean>

Я мог бы поместить каждый из наборов свойств в свой собственный каталог и иметь

<value>classpath:properties/#{systemEnvironment['env']}/*.properties</value>

Еще раз спасибо всем за вашу помощь.

person Stephen McConnell    schedule 27.08.2014