начальное значение карты зависит от переменной окружения в spring

#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. Может быть, вы можете попробовать #{#{…}} ?