Lecture des proriétés: Simplifiez vous la vie avec Spring!

L'objectif de ce billet est triple:

a) Lire une valeur de propriété depuis un fichier .properties,

b) Lire les valeurs des JVM/System properties,

c) Surcharger les valeurs de propriété avec des JVM/SYSTEM properties ?

spring-mini-logo.png

Tout projet quelque soit sa nature repose sur un ou plusieurs fichiers de propriétés configurés aussi pour i18N.

Et dans ce domaine, encore une fois, Spring 3 avec ses nouveautés confirme l'adage:

Spring rend les choses simples simples et les choses complexes possibles

La version Spring 3.1 ou + est nécessaire et Java 5+.

Les exemples donnés ci-après ont été testés sous Win/java7. Le code des exemples sera fourni en fin de billet.

Passons à la mise en pratique.

I- PREMIER EXEMPLE: Lecture des properties

ACTE1. Déclarer les valeurs de propriétés

Commençons notre premier projet maven par écrire un fichier app.properties sous src/main/resources.

Il déclare une seule valeur :

mail.admin=admin@gmail.com

ACTE2. Configurer Spring

Le fichier de spring nommé props-context.xml doit comporter cette declaration qui pointe vers le fichier de properties.

<bean
 class="org.springframework.beans.factory.config.
        PropertyPlaceholderConfigurer">
  <property name="locations" value="classpath:app.properties" />
</bean>

ACTE3. Tester

La classe test Junit :

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
      {"classpath:META-INF/spring/props-context.xml"})
public class TestListFromCtx {

  @Value("${mail.admin}")
  private String mailAdmin;
  @Test
  public void lireListeFromCtx(){		
	 Assert.assertTrue("mailAdmin="+mailAdmin, 
		      "admin@gmail.com".equals(mailAdmin));
  }
}

Lancer la commande

mvn test

Voilà c'est tout ... simple. Vous voyez moins de code (et moins de bug, de recette, de retard,..).

Spring rend les choses simples encore plus simples. N'est ce pas?

II. SECOND EXEMPLE: Récupérer les variables système

La classe de test doit être adaptée en déclarant @Autowired Environement env,

Voici son code:

@Autowired Environment env;
@Test public void lireSystemProperties(){
 String region = env.getProperty("REGION");
 System.out.println("region:"+region);
}

Lancer la commande:

mvn test -DREGION=CENTRE

Le test affiche correctement l'argument passé.

C'est tout simple. N'est ce pas?

Le troisième exemple va nous permettre d'aller plus loin.

III. TROISIEME EXAMPLE: Surcharger les valeurs properties (sans coder est ce possible?)

Ici nous vérifions la seconde partie de l'adage: rendre les choses complexes possibles (et simples à mettre en place).

Nous souhaitons tout simplement que lorsque je passe en ligne de commande une propriété système ayant le même nom qu'une propriété existante qu'elle soit surchargée.

Pour cela, nous procédons en deux actes:

ACTE1. Configurer Spring

On ajoute le paramètre "systempropertiesModeName" valorisé sur SYSTEM_PROPERTIES_MODE_OVERRIDE comme illustré ci-après:

<bean
  class="org.springframework.beans.factory.config.
         PropertyPlaceholderConfigurer">
  <property name="systemPropertiesModeName" 
           value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
  <property name="location">
    <value>classpath:application.properties</value>
  </property>
</bean>

ACTE2. Tester

Nous reprenons le premier test de l'exemple I et nous le modifions comme suit :

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:META-INF/spring/props-context.xml"})
public class TestListFromCtx {

	@Value("${mail.admin}")
	private String mailAdmin;

	@Test
	public void lireListeFromCtx(){		
		System.out.print("mailAdmin="+mailAdmin);
	}
}	

Nous ne pouvons garder l'assertion puisque désormais la valeur peut être passé dynamiquement en ligne de commande.

Lançons donc la commande:

mvn test -Dmail.admin=new_mail_admin@gmail.com

La sortie confirme la prise en compte de l'argument -Dmail.admin.

Notez que le nom 'mail.admin' de la propriété est identique à celui déclarée dans app.properties.

C'est simple. N'est ce pas.

Mais n'abusez pas des bonnes choses au risque de dérouter les nouveaux qui lisent votre code!

@Enjoy

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.