13

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

в то время как заполнитель configurer определяется как

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

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

С уважением, Dmitriy.

ответ

23

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

Э.Г.

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

или

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

Я использую свойство заполнитель configurer как этот

<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> 

где среда прод/этап/тест/INT/CI/локальный (1 на окружающую среду - вы можете иметь только 2 или 3 для Теперь). Вы можете передать переменную окружения в программу. Любые свойства, которые должны быть одинаковыми независимо от того, будет ли его создание/выполнение на вашем локальном ПК/тесте в файле свойств someprops.properties. Любые объекты, специфичные для среды/способа ее запуска, как будут поступать в более конкретном файле (вы должны поместить его в файл someprops.properties, а также по умолчанию, если не переопределенный механизм)

E.g. в пути к классам: someprops.properties

url=www.mysite.com 

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

url=localhost 

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

+0

Это очень хорошо. Однако одна из проблем заключается в том, что забывание определить переменную времени выполнения создает сложные ошибки времени выполнения, такие как файл config_xxx, который не найден, и подобные. Чтобы улучшить эту ситуацию, я регистрирую компонент, который реализует специальные пружинные интерфейсы, такие как: class EnvironmentReporter реализует PriorityOrdered, BeanFactoryPostProcessor, EnvironmentAware {...} environment.getProperty позволяет мне проверять ожидаемые свойства и отказываться до того, как любой другой компонент получит создано. – Federico

7

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

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

Изменить ваш:

property.name=${env.SYSTEM_PROPERTY} 

To:

property.name=${SYSTEM_PROPERTY} 

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

+1

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

+1

странно - используя весну 3.0.4, это, похоже, не работает –

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^