Разрешение переменной системной среды с использованием Spring Expression Language

Я хочу разрешить переменную системной среды, используя Spring Expression Language в файле конфигурации сервлета spring. Мой первый подход был:

 <bean id="propertyConfigurer"
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
     p:location="/WEB-INF/jdbc.#{systemEnvironment.THREAD_ENV}.properties" />

Это исключение ниже:

Caused by: org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 18): Field or property 'THREAD_ENV' cannot be found on object of type 'java.util.Collections$UnmodifiableMap'

Затем я попробовал:

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/jdbc.#{systemEnvironment['THREAD_ENV']}.properties" />

а также

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/jdbc.#{systemEnvironment[THREAD_ENV]}.properties" />

которые оба терпят неудачу и разрешают пустую строку. Я использую Tomcat6 и экспортирую эту переменную непосредственно перед перезапуском сервера Tomcat:

export THREAD_ENV=live;
/etc/init.d/tomcat6 restart;

Хотел бы отметить, что все три метода работают на некоторых моих экземплярах Tomcat6, но не на всех - в чем может быть причина такого странного поведения? Любая идея, что я делаю неправильно?


person mkorszun    schedule 27.05.2014    source источник


Ответы (1)


Переменная SpEL имеет значение systemProperties, а не systemEnvironment.

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/jdbc.#{systemProperties['THREAD_ENV']}.properties" />
person Luiggi Mendoza    schedule 27.05.2014
comment
будет ли это работать с системными переменными ОС? Я ожидаю, что он будет работать только со свойствами jvm - во всяком случае, я пробовал, и моя переменная снова разрешается в пустую строку. - person mkorszun; 28.05.2014
comment
Spring предоставляет как systemProperties, так и systemEnvironment. - person Sotirios Delimanolis; 28.05.2014
comment
@SotiriosDelimanolis, где ты это нашел? Единственная ссылка, которую я могу найти, — это косвенная ссылка по адресу Spring API, который, как я предполагаю (но это не явно), относится к SpEL и говорит, что "systemEnvironment" из ОС, а "systemProperties" из JVM. Мой краткий тест подтверждает последнее, но я не могу получить окружение Windows с помощью systemEnvironment. - person Adam; 25.09.2014
comment
@Adam Адам Скорее всего, в исходном коде. Я должен вернуться к вам. - person Sotirios Delimanolis; 25.09.2014
comment
@SotiriosDelimanolis нашел его — он находится в Запись Spring API для PropertySourcesPlaceHolderConfigurer, и я невольно использовал устаревший простой старый PropertyPlaceholderConfigurer. Пришлось обновить ссылку на схему до spring-context-3.1.xsd и класс propertyConfigurer до org.springframework.context.support.PropertySourcesPlaceholderConfigurer, и вдруг это сработало. Слишком долго гуглил SpEL - person Adam; 25.09.2014
comment
@Adam Взгляните на StandardEnvironment тоже. Это базовый класс большинства типов Environment. - person Sotirios Delimanolis; 25.09.2014