web-dev-qa-db-fra.com

Comment injecter des variables environnementales dans la configuration XML de Spring?

AWS parle de System.getProperty("JDBC_CONNECTION_STRING") dans http://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/create_deploy_Java.managing.html après avoir configuré nos variables d'environnement. Tout va bien sauf que je ne peux pas appeler System.getProperty dans mon code de configuration XML Spring, je ne peux pas non plus appeler de raccourcis de regroupement de ressources, car le regroupement de ressources lui-même doit extraire en quelque sorte ces variables d'environnement pour les servir. Pourriez-vous m'aider à convertir cet exemple de configuration pour utiliser des variables d'environnement? :-)

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

Je n'ai pas pu comprendre ce que font les gens ici:

Puis-je utiliser un emplacement basé sur une variable d'environnement pour Spring FileSystemResource? qui fonctionnerait pour la version récente de Spring?

29
Aubergine

Ajoutez d'abord un <context:property-placeholder .. /> élément à votre configuration.

<context:property-placeholder />

Ensuite, utilisez simplement des espaces réservés dans votre configuration.

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

Assurez-vous que les noms d'espace réservé correspondent à vos variables que vous avez configurées.

46
M. Deinum

Si vous utilisez la classe org.springframework.beans.factory.config.PropertyPlaceholderConfigurer pour charger les fichiers de propriétés, vous pouvez définir la propriété systemPropertiesMode sur la valeur SYSTEM_PROPERTIES_MODE_OVERRIDE.

Dans le fichier spring.xml, vous aurez ce bean:

<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 chargera les propriétés du système de cette manière:

Vérifiez d'abord les propriétés du système avant d'essayer les propriétés spécifiées. Cela permet aux propriétés système de remplacer toute autre source de propriété.

De cette façon, vous devriez pouvoir lire les propriétés du système comme des propriétés normales.

9
MPavesi

Pour quelqu'un qui utilise JavaConfig:

Dans le fichier @Configuration, nous devons avoir:

@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;
}

l'important est la ligne: ppc.setSearchSystemEnvironment (true);

après cela dans db.properties, j'ai:

db.url = ${PG_URL}
db.driver = ${PG_DRIVER}
db.username = ${PG_USERNAME}
db.password = ${PG_PASSWORD}
5
Tomasz Janisiewicz