#java #spring
#java #spring
Вопрос:
У меня есть spring map, объявленная в контексте приложения xml следующим образом:
<map>
<entry key="mykey">
<value>${${env}.userkey}</value>
</entry>
</map>
Однако значение никогда не заменяется средой. Есть ли способ сделать это?
Спасибо,
Шон
Комментарии:
1. Я не использую Spring, но должно ли это быть EL или что-то проприетарное? Если EL, то в какой области
${env}
должно быть? Запрос, сеанс или приложение?2. env может быть либо системным свойством, либо переменной окружения. В моем тесте я использую системное свойство в командной строке java: -Denv=local
3. Ну что ж, это будет что-то проприетарное. Извините, не знаю 🙂 Если бы это было EL и
${env}
находится в области приложения, то${applicationScope[env].userkey}
это должно было сработать.4. Добавьте информацию, какую версию Spring вы используете.
Ответ №1:
Поддерживает ли #{SystemProperties} переменные окружения? Как насчет использования PropertyPlaceholderConfigurer, который выполняет (ссылка)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:env.properties" />
</bean>
<util:map id="map">
<entry key="mykey">
<value>${${env}.userkey}</value>
</entry>
</util:map>
env.properties:
local.userkey=Me
Модульный тест:
package org.test;
import static org.junit.Assert.assertEquals;
import java.util.Map;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class EnvTest {
@Resource
private Map<String, String> map;
@Test
public void testMap() throws Exception {
assertEquals("Me", map.get("mykey"));
}
}
Комментарии:
1.
systemProperties
нет, ноsystemEnvironment
делает ;] Заполнитель свойств — хороший способ, но вы указали только способ чтения свойств из пользовательского файла, без аргументов среды или cmd.2. в соответствии со свойствами systemPropertiesMode и searchSystemEnvironment property заполнитель свойств также выполняет поиск в среде и системных свойствах.
3. Моя проблема в том, что каким-то образом это не работает с моим spring-servlet.xml в которой есть пространство имен oauth. Когда я перемещаю ее в другой xml, это работает.
Ответ №2:
Если вы используете Spring 3
В конфигурациях Spring вы можете использовать SpEL, и, вероятно, вам нужны такие системные свойства, как это:
<map>
<entry key="mkey" value="#{ systemProperties['env'] '.userkey' }" />
</map>
Комментарии:
1. Разве это
'env'
не должно быть без кавычек, поскольку это тоже переменная?2. Нет, это не var — его ключ и
systemProperties
является map.3. Это не работает. Он не выполняет вторую замену ‘local.userkey’, когда ‘env=local’.
4. Может быть, вы можете попробовать #{#{…}} ?