Dernière modification : 24/08/2022

Les fichiers de configuration : Les Properties avec Spring Boot

Dans cet article nous allons voir comment utiliser les fichiers de configuration "properties" avec Spring Boot. La gestion des properties citée dans l'article Spring Properties est également valable pour Spring Boot.

1 L'annotation @ConfigurationProperties

1.1 Injection par le nom des variables

Il est possible d'ommetre l'annotation @Value si l'annotation @ConfigurationProperties est présente sur la classe (Spring Boot). Ici le nom des variables et des properties doivent avoir le même nom :

@PropertySource("classpath:app1.properties")
@ConfigurationProperties
@Component
public class PropertiesClass {

    private String email;
    
    // getters and setters
}

Exemple de fichier de properties :

email=test@test.com

1.2 Injection dans des classes

Il est possible d'injecter une liste ou encore une classe via les fichiers de properties et l'injection de dépendance. Ici le nom des variables et des properties doivent avoir le même nom :

@Component
@PropertySource("classpath:app1.properties")
@ConfigurationProperties("person")
public class Person {
	String name;
	List cars;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List getCars() {
		return cars;
	}
	public void setCars(List cars) {
		this.cars = cars;
	}
}
@Component
@ConfigurationProperties("car")
public class Car {

	private Long id;
	
	private String model;
	
	private String registration;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getModel() {
		return model;
	}

	public void setModel(String model) {
		this.model = model;
	}

	public String getRegistration() {
		return registration;
	}

	public void setRegistration(String registration) {
		this.registration = registration;
	}
}

Fichier app1.properties :

person.name=alex
person.cars[0].registration=aaa-aaa
person.cars[1].registration=bbb-bbb

2. Validation

La validation des données injectées dans les classes se fait à l'aide de l'annotation @Validated :

@Component
@Validated
@PropertySource("classpath:app1.properties")
@ConfigurationProperties("person")
public class Person {
	@Size(min = 50)
	String name;
	List cars;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List getCars() {
		return cars;
	}
	public void setCars(List cars) {
		this.cars = cars;
	}
}

Fichier app1.properties :

person.name=alex

L'erreur suivante apparaît au lancement de l'application :

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'person' to com.laulem.springboot.model.Person failed:

    Property: person.name
    Value: alex
    Origin: class path resource [app1.properties] - 2:13
    Reason: size must be between 50 and 2147483647


Action:

Update your application's configuration

3. Properties au lancement de l'application

Il est faisable de fournir des properties au lancement de l'application :

java -jar app.jar --mail="test@mail.com"
java -Dproperty.mail="test@mail.com" -jar app1.jar

De plus, Spring Boot permet la récupération de properties au travers des variables globales :

export mail=test@mail.com
java -jar app1.jar

4. Changement du dossier contenant les properties

Il est possible de changer l'emplacement des fichiers properties en vue de les externaliser. Cela est possible en ajoutant le paramètre --spring.config.location au lancement de l'application. Exemple :

$ java -jar app1.jar --spring.config.location=/home/app1/properties/properapp1.properties