In questo articolo scoprirai come recuperare e leggere le proprietà dell’applicazione definite nel file application.yml (o application.properties) di un progetto Spring Boot, e come utilizzarle all’interno di un componente.
Come esempio, andiamo a leggere le proprietà propNumber e propText definite nel file application.yml cosi definite:
custom:
example:
propNumber: 12345
propText: text
Analogamente per il file application.properties:
custom.example.propNumber=12345
custom.example.propText=text
Spring Boot gestisce sia estensione YAML che properties per i file che rappresentano le proprietà.
Gli strumenti per leggere le proprietà dell'applicazione
Come promesso, di seguito, i modi per leggere le proprietà dell’applicazione in Spring Boot.
Utilizzare l'annotazione @Value
Un modo per leggere le proprietà dell’applicazione, e quindi il suo valore, è tramite l’annotazione @Value.
Basta inserire l’annotazione subito sopra l’attributo della classe da valorizzare specificando la dichiarazione (il percorso all’interno del file properties/yml) della proprietà dentro @Value() con la sintassi ${}.
@Component
public class ClassService {
@Value("${custom.example.propNumber}")
private int propN;
@Value("${custom.example.propText}")
private String propT;
...
}
È possibile utilizzare l’annotazione @Value tra i parametri di un metodo, ad esempio nel costruttore della classe:
@Component
public class ClassService {
private int propN;
public ClassService(@Value("${custom.example.propNumber}") int propN) {
this.propN = propN;
}
}
La conversione del tipo di dato viene eseguita automaticamente. Nell'esempio l'attributo propN assumerà il valore intero 12345 mentre propT la stringa "text". Se ad esempio dichiariamo l'attributo propN come String con lo stesso riferimento alla proprietà, allora il suo valore assumerà il valore stringa "12345".
Leggere array o liste di elementi
Una proprietà può essere dichiara come una successione di elementi separati da virgola (sintassi di default per Spring), oppure assegnando valori diversi alla stessa proprietà.
custom.example.listEl = a,b,c
custom.example.listEl = a
custom.example.listEl = b
custom.example.listEl = c
Per entrambe le modalità viste, possiamo leggere il valore della proprietà all’interno del componente tramite l’annotazione @Value vista poco fa. Il tipo di dato aspettato potrà essere una lista oppure un array.
@Value("${custom.example.listEl}")
private List listEl;
@Value("${custom.example.listEl}")
private String[] listEl;
Expression
L’annotazione @Value permette l’utilizzo di espressioni tramite la sintassi #{..}.
@Value("#{${custom.example.listEl}}")
private List listEl;
Una Expression permette di eseguire operazioni nella lettura delle proprietà. Avremmo potuto dichiarare la proprietà listEl utilizzando una sintassi personalizzata sostituendo le virgole con altri caratteri, ad esempio ‘;’
custom.example.listEl = a;b;c;
Utilizzando il metodo .split() all’interno di un’espressione possiamo ottenere il risultato precedente:
@Value("#{'${custom.example.listEl}'.split(';')}")
private List listEl;
Leggere una mappa di valori
Con le Expression è possibile dichiarare attributi hashmap senza incombere in eccezioni come IllegalStateException, specificando tra parentesi graffe le coppie chiave-valore separate da virgola, come nell’esempio:
custom.example.mapEl={a:1, b:2, c:3}
@Value("#{${custom.example.mapEl}}")
Map<String, Integer> mapEl;
Utilizzare l'annotazione di classe @ConfigurationProperties
Un modo efficace, soprattutto quando si vuole assegnare il valore di molti attributi, è quello di utilizzare l’annotazione @ConfigurationProperties a livello di classe.
@Component
@ConfigurationProperties(prefix = "custom.example")
public class ClassService {
private int propNumber;
private String propString;
public int getPropNumber() {
return propNumber;
}
public void setPropNumber(int propNumber) {
this.propNumber = propNumber;
}
public String getPropString() {
return propString;
}
public void setPropString(String propString) {
this.propString = propString;
}
}
Per fare questo, è necessario seguire alcune regole
- specificare le proprietà sotto lo stesso prefisso (come nell’esempio: custom.example)
- i nomi degli attributi della classe devono avere lo stesso nome delle proprietà (propNumber, propText)
- devono essere presenti i corrispettivi metodi getter e setter
Trattandosi di una validazione hibernate, deve essere presente hibernate-validator (incluso nello starter di spring-boot).
Utilizzare l'interfaccia Environment
Abbiamo visto come sia possibile ottenere il valore delle proprietà attraverso le annotazioni @Value e @ConfigurationProperties.
Un altro modo per ottenere lo stesso risultato è quello di utilizzare l’interfaccia Environment, iniettandola all’interno della classe:
@Component
public class ClassService {
@Autowired
private Environment env;
private int propNumber;
private String propString;
public ClassService() {
this.propNumber = env.getProperty("custom.example.propNumber", Integer.class);
this.propString = env.getProperty("custom.example.propText");
}
}
Nel caso in cui non si tratta di una String, occorre specificare tra gli argomenti il tipo di dato (es. Integer.class).
Prossimo step
In questo articolo hai visto come leggere le proprietà di un’applicazione Spring Boot, ma è solo una delle potenzialità che offre il framework per lo sviluppo di applicazioni server. In questo sito puoi trovare altri esempi su Spring Boot, ad esempio come comunicare con il database in un’applicazione Spring Boot.
No comment yet, add your voice below!