PropertyPlaceholderConfigurer и переменные среды В.файл свойств

у меня есть приложение Spring-контекста.xml с PropertyPlaceholderConfigurer для получения значений свойств .файл свойств. Исходные папки Main и test разделены .файл свойств. Вопрос в том, что мне нужно использовать переменные среды .файл свойств. Но когда я делаю это следующим образом:

property.name=${env.SYSTEM_PROPERTY}

Я получаю следующую ошибку:

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'beanName' defined in class path resource [com/example/applicationContext.xml]: Could not resolve placeholder 'env.SYSTEM_PROPERTY'

в то время как конфигуратор заполнителя определяется как

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:com/example/application.properties"/>
</bean>

любые идеи, как сделать собственность.имя интерпретируется как переменная среды (а не как заполнитель)?

С наилучшими пожеланиями, Дмитрий.

3 ответов


Я бы, вероятно, полностью изменил решение: ввести системное свойство напрямую, а не вводить свойство, которое относится к системному свойству

Е. Г.

@Value("#{ systemProperties['JAVA_MY_ENV'] }") 
private String myVar;

или

<property name ="myVar" value="#{systemProperties['JAVA_MY_ENV']}"/>

Я использую конфигуратор заполнителя свойств, как это

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
        <value>classpath:someprops.properties</value>
    </list>
  </property>
  <property name="ignoreResourceNotFound" value="true" />
  <property name="searchSystemEnvironment" value="true" />
  <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />

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

 -DJAVA_MY_ENV=xyz

этот путь когда вы бежите версия продукции вы можете пройти одну вещь и когда вы тестируют еще.

также то, что я часто делаю, это что-то вроде этого:

  <property name="locations">
    <list>
      <value>classpath:someprops.properties</value>
      <value>classpath:someprops-{environment}.properties</value>
    </list>
  </property>

где среда prod / stage/test/int/ci / local (1 на среду - у вас может быть только 2 или 3 на данный момент). Переменную среды можно передать программе. Любые свойства, которые должны быть одинаковыми, независимо от того, будет ли его производство/запуск на вашем локальном ПК/тестах в someprops.файл свойств. Любые, специфичные для окружающей среды/способа ее запуска как пойдет в более конкретном файле (вы должны поместить его в someprops.свойства файла, а также по умолчанию, если не переопределен механизм)

Е. Г. в classpath: someprops.свойства

url=www.mysite.com

в classpath: someprops-локальный.свойства

url=localhost

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


использование:

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

изменить:

property.name=${env.SYSTEM_PROPERTY}

В:

property.name=${SYSTEM_PROPERTY}

Я использую Spring 3.0.4.Отпустите, но я понятия не имею, когда это было введено.


я использовал подход бенкифера, но мне пришлось добавить слушателя в web.XML-код:

<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>