Подтвердить что ты не робот

PropertyPlaceholderConfigurer и переменные окружения в файлах .properties.

У меня есть Spring application-context.xml с PropertyPlaceholderConfigurer, чтобы получить значения свойств из файла .properties. Основные и тестовые исходные папки имеют отдельный файл .properties. Проблема в том, что мне нужно использовать переменные среды в файле .properties. Но когда я делаю это следующим образом:

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>

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

С уважением, Дмитрий.

4b9b3361

Ответ 1

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

например.

@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.properties. Любые объекты, специфичные для среды/способа ее запуска, как будут поступать в более конкретном файле (вы должны поместить его в файл someprops.properties, а также по умолчанию, если не переопределенный механизм)

например. в classpath: someprops.properties

url=www.mysite.com

в пути к классам: someprops-local.properties

url=localhost

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

Ответ 2

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

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

Измените:

property.name=${env.SYSTEM_PROPERTY}

To:

property.name=${SYSTEM_PROPERTY}

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

Ответ 3

Я использовал подход benkiefer, но мне пришлось добавить слушателя в web.xml:

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