Lettura di un elenco dal file di proprietà e caricamento con annotazione a molla @Valore

Simile a questa domanda: http://forum.springsource.org/showthread.php?111992- Loading -a- list – from – properties -file- using – Value – annotation (per cui non c’è risposta su)

Voglio avere una lista di valori in un file .properties, cioè:

my.list.of.strings=ABC,CDE,EFG 

E per caricarlo direttamente nella mia class, cioè:

 @Value("${my.list.of.strings}") private List myList; 

Come ho capito, un’alternativa di fare questo è averlo nel file di configurazione di spring, e caricarlo come riferimento bean (correggimi se ho torto), cioè

   ABC CDE EFG   

Ma c’è un modo per farlo? usando un file .properties? ps: Mi piacerebbe farlo senza alcun codice personalizzato, se ansible.

Utilizzando Spring EL:

 @Value("#{'${my.list.of.strings}'.split(',')}") private List myList; 

Supponendo che il file delle proprietà sia stato caricato correttamente con quanto segue:

 my.list.of.strings=ABC,CDE,EFG 

Dalla spring 3.0, puoi aggiungere una linea simile

  

al tuo applicationContext.xml (o dove configuri le cose). Come sottolinea Dmitry Chornyi in un commento, la configurazione basata su Java ha il seguente aspetto:

 @Bean public ConversionService conversionService() { return new DefaultConversionService(); } 

Questo triggers il nuovo servizio di configurazione che supporta la conversione di String in tipi di Collection . Se non si triggers questo servizio di configurazione, Spring ricade sui suoi editor di proprietà legacy come servizi di configurazione, che non supportano questo tipo di conversione.

Anche la conversione in raccolte di altri tipi:

 @Value("${my.list.of.ints}") private List myList 

funzionerà con una linea come

  my.list.of.ints= 1, 2, 3, 4 

Nessun problema con gli spazi bianchi, il ConversionServiceFactoryBean prende cura di esso.

Vedi http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config

In un’applicazione Spring, in genere si configura un’istanza di ConversionService per il contenitore Spring (o ApplicationContext). Quel ConversionService verrà raccolto da Spring e quindi utilizzato ogni volta che una conversione di tipi deve essere eseguita dal framework. […] Se nessun ConversionService è registrato con Spring, viene utilizzato il sistema basato su PropertyEditor originale.

Specificando my.list.of.strings=ABC,CDE,EFG nel file .properties e utilizzando

@Value("${my.list.of.strings}") private String[] myString;

È ansible ottenere gli array di stringhe. E usando CollectionUtils.addAll(myList, myString) , puoi ottenere l’elenco delle stringhe.

Hai considerato @Autowired il costruttore o un setter e String.split() ing nel corpo?

 class MyClass { private List myList; @Autowired public MyClass(@Value("${my.list.of.strings}") final String strs) { myList = Arrays.asList(strs.split(",")); } //or @Autowired public void setMyList(@Value("${my.list.of.strings}") final String strs) { myList = Arrays.asList(strs.split(",")); } } 

Preferisco fare il mio autowiring in uno di questi modi per migliorare la testabilità del mio codice.

Tutte le risposte sopra sono corrette. Ma puoi ottenere questo risultato in una sola riga. Si prega di provare la seguente dichiarazione e otterrete tutti i valori separati da virgola in una lista di stringhe.

 private @Value("#{T(java.util.Arrays).asList(projectProperties['my.list.of.strings'])}") List myList; 

E inoltre devi avere la seguente riga definita nella tua configurazione xml.

  

basta sostituire il percorso e il nome del file delle proprietà. E tu sei bello andare. 🙂

Spero che questo ti aiuti. Saluti.

Se stai leggendo questo e stai usando Spring Boot , hai un’altra opzione per questa funzione

Di solito le liste separate da virgola sono molto goffe per il caso d’uso del mondo reale (e talvolta non è nemmeno fattibile, se vuoi usare le virgole nella tua configurazione):

 email.sendTo=somebody@example.com,somebody2@example.com,somebody3@example.com,..... 

Con Spring Boot puoi scriverlo come questo (l’indice parte da 0):

 email.sendTo[0]=somebody@example.com email.sendTo[1]=somebody2@example.com email.sendTo[2]=somebody3@example.com 

E usalo come questi:

 @Component @ConfigurationProperties("email") public class EmailProperties { private List sendTo; public List getSendTo() { return sendTo; } public void setSendTo(List sendTo) { this.sendTo = sendTo; } } @Component public class EmailModel { @Autowired private EmailProperties emailProperties; //Use the sendTo List by //emailProperties.getSendTo() } @Configuration public class YourConfiguration { @Bean public EmailProperties emailProperties(){ return new EmailProperties(); } } #Put this in src/main/resource/META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=example.compackage.YourConfiguration 

puoi farlo con annotazioni come questa

  @Value("#{T(java.util.Arrays).asList('${my.list.of.strings:a,b,c}')}") private List mylist; 

qui le stringhe my.list.of verranno selezionate dal file delle proprietà, se non è lì, quindi verranno utilizzate le impostazioni predefinite a, b, c

e nel tuo file delle proprietà, puoi avere qualcosa di simile

my.list.of.strings = d, e, f

Prendi in considerazione l’utilizzo di Commons Configuration. È dotato di funzionalità incorporate per interrompere una voce nel file delle proprietà su array / elenco. Combinare con SpEL e @Value dovrebbe dare quello che vuoi


Come richiesto, ecco quello di cui hai bisogno (non hai davvero provato il codice, potrebbero esserci dei refusi, per favore portami dietro):

In Apache Commons Configuration, c’è PropertiesConfiguration. Supporta la funzione di conversione della stringa delimitata in array / lista.

Ad esempio, se hai un file di proprietà

 #Foo.properties foo=bar1, bar2, bar3 

Con il seguente codice:

 PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties"); String[] values = config.getStringArray("foo"); 

ti fornirà una serie di stringhe di ["bar1", "bar2", "bar3"]

Per utilizzare Spring, prendi questo nel tuo contesto xml dell’app:

    

e avere questo nel tuo fagiolo spring:

 public class SomeBean { @Value("fooConfig.getStringArray('foo')") private String[] fooArray; } 

Credo che questo dovrebbe funzionare: P

Fai attenzione agli spazi nei valori. Potrei sbagliarmi, ma penso che gli spazi nella lista separata da virgola non vengano troncati usando @Value e Spel. La lista

 foobar=a, b, c 

sarebbe letto come una lista di stringhe

 "a", " b", " c" 

Nella maggior parte dei casi probabilmente non vorrai gli spazi!

L’espressione

 @Value("#{'${foobar}'.trim().replaceAll(\"\\s*(?=,)|(?< =,)\\s*\", \"\").split(',')}") private List foobarList; 

ti darebbe un elenco di stringhe:

 "a", "b", "c". 

L’espressione regolare rimuove tutti gli spazi appena prima e subito dopo una virgola. Gli spazi all’interno dei valori non vengono rimossi. Così

 foobar = AA, BB, CCC 

dovrebbe risultare in valori

 "AA", "BB", "CCC". 

se si utilizzano i segnaposto di proprietà, l’esempio di ser1702544 diventerebbe

 @Value("#{myConfigProperties['myproperty'].trim().replaceAll(\"\\s*(?=,)|(?< =,)\\s*\", \"\").split(',')}") 

Con segnaposto xml:

   $myConfigProperties{     classpath:myprops.properties