2013-09-11 5 views
27

AWS рассказывает о System.getProperty("JDBC_CONNECTION_STRING") в http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Java.managing.html после того, как мы установили наши переменные окружающей среды. Все замечательное, за исключением того, что я не могу позвонить System.getProperty внутри моего конфигурационного кода Spring XML, и я не могу вызвать ярлыки пакетов ресурсов, поскольку сам пакет ресурсов должен каким-то образом извлечь эти переменные среды для их обслуживания. Не могли бы вы мне помочь, пожалуйста, чтобы преобразовать эту конфигурацию примера, чтобы использовать переменные окружения? :-)Как вводить переменные окружающей среды в конфигурацию весны xml?

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://secrethost:007/whois?autoReconnect=true" /> 
    <property name="username" value="bond" /> 
    <property name="password" value="abuginsidemistycorner" /> 
    <property name="initialSize" value="100" /> 

    <property name="minEvictableIdleTimeMillis"> 
     <value>300000</value> 
    </property> 

    <property name="timeBetweenEvictionRunsMillis"> 
     <value>60000</value> 
    </property> 

    <property name="maxIdle" value="20" /> 
</bean> 

Я не был в состоянии понять, что люди делают здесь:

Can I use an Environment variable based location for Spring FileSystemResource?, который будет работать на недавней весенней версии?

ответ

42

Сначала добавьте элемент <context:property-placeholder .. /> в вашу конфигурацию.

<context:property-placeholder /> 

Тогда просто используйте заполнители в своей конфигурации.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="${JDBC_CONNECTION_STRING}" /> 
    <property name="username" value="bond" /> 
    <property name="password" value="abuginsidemistycorner" /> 
    <property name="initialSize" value="100" /> 
    <property name="minEvictableIdleTimeMillis" value="30000" /> 
    <property name="timeBetweenEvictionRunsMillis" value="60000" /> 
    <property name="maxIdle" value="20" /> 
</bean> 

Убедитесь, что имена заполнителей соответствуют вашим переменным, которые у вас установлены.

+0

ничего себе, вот и все! :-) – Aubergine

+0

Это теория :). –

+0

благодарит миллион за это. – vikingsteve

8

Если вы используете класс org.springframework.beans.factory.config.PropertyPlaceholderConfigurer для загрузки файлов свойств, вы можете указать объект systemPropertiesMode со значением SYSTEM_PROPERTIES_MODE_OVERRIDE.

В spring.xml вы будете иметь этот компонент:

<bean id="propertyPlaceholder" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="locations"> 
     <list> 
      <value>classpath://file.properties</value>     
     </list> 
    </property> 
</bean> 

Spring загрузит свойства системы таким образом:

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

Таким образом, вы должны иметь возможность читать свойства системы как обычные свойства.

3

Для кого-то, кто использует JavaConfig:

В @Configuration файл нам нужно иметь:

@Bean 
public static PropertyPlaceholderConfigurer properties() { 

    PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); 
    ClassPathResource[] resources = new ClassPathResource[ ] { 
     new ClassPathResource("db.properties") 
    }; 
    ppc.setLocations(resources); 
    ppc.setIgnoreUnresolvablePlaceholders(true); 
    ppc.setSearchSystemEnvironment(true); 
    return ppc; 
} 

@Value("${db.url}") 
private String dbUrl; 
@Value("${db.driver}") 
private String dbDriver; 
@Value("${db.username}") 
private String dbUsername; 
@Value("${db.password}") 
private String dbPassword; 

@Bean 
public DataSource db() { 

    BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setUrl(dbUrl); 
    dataSource.setDriverClassName(dbDriver); 
    dataSource.setUsername(dbUsername); 
    dataSource.setPassword(dbPassword); 
    return dataSource; 
} 

важна линия: ppc.setSearchSystemEnvironment (истина);

после этого в db.Properties, у меня есть:

db.url = ${PG_URL} 
db.driver = ${PG_DRIVER} 
db.username = ${PG_USERNAME} 
db.password = ${PG_PASSWORD} 
Смежные вопросы