File .properties di primavera: ottieni l'elemento come un array


91

Sto caricando gli attributi delle proprietà da un .propertiesfile utilizzando Spring come segue:

file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6

Il file xml di primavera

file: myapplication.xml
<bean id="some"
      class="com.some.Class">
      <property name="property" value="#{base.module.elementToSearch}" />
</bean>

E il mio Class.java

file: Class.java
public void setProperty(final List<Integer> elements){
    this.elements = elements;
}

Ma durante il debug, gli elementi dei parametri inseriscono solo l'ultimo elemento nell'elenco, quindi, c'è un elenco di un elemento con valore "6", invece di un elenco con 6 elementi.

Ho provato altri approcci, come l'aggiunta del solo valore, #{base.module}ma poi non trova alcun parametro nel file delle proprietà.

Una soluzione alternativa è avere nel file elements.properties un elenco separato da virgole, come:

base.module.elementToSearch=1,2,3,4,5,6

e usalo come una stringa e analizzalo, ma esiste una soluzione migliore?



quindi ho bisogno di passarlo come stringa separata da virgole e analizzarlo nel metodo.
RamonBoza

Esatto, anche se alcune librerie lo stanno già facendo per te (apache commons) - commons.apache.org/configuration/howto_properties.html
Colin Hebert,

Ecco una risposta che ti dà almeno un risultato Set <String>. Non proprio una lista <String>, ma probabilmente sufficiente in molti casi! stackoverflow.com/questions/5274362/…
John Rix,

Risposte:


189

Se definisci il tuo array nel file delle proprietà come:

base.module.elementToSearch=1,2,3,4,5,6

Puoi caricare tale array nella tua classe Java in questo modo:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;

5
I miei elementi contengono virgola. Come esco dal separatore? "\," anche "\\" non funzionano.
battute CZ

Puoi provare a ottenerli come lista di numeri interi e poi convertirli @Value ("$ {base.module.elementToSearch}") private List <Integer> elementToSearch;
Gal Bracha

+1, proprio quello di cui avevo bisogno. Sfortunatamente la lettura di valori separati da virgola in a List<String>nello stesso modo non sembra funzionare (l'elenco avrà solo un elemento).
Jonik

4
Posso confermare che l'utilizzo String[]come tipo funziona, dove l'utilizzo List<String>non funziona.
Wim Deblauwe

2
Se si desidera che questo lavoro con List<String>al posto di String[], è necessario aggiungere almeno <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">al vostro applicationContext.xml. Altrimenti non viene utilizzato il servizio di conversione ma gli editor di proprietà predefiniti, che non supportano la conversione di stringhe in raccolte, solo array: docs.spring.io/spring/docs/current/spring-framework-reference/…
Clemens Klein-Robbenhaar

36

E in caso di un delimitatore diverso dalla virgola, puoi usare anche quello.

@Value("#{'${my.config.values}'.split(',')}")
private String[] myValues;   // could also be a List<String>

e

nelle proprietà dell'applicazione che potresti avere

my.config.values=value1, value2, value3

questo utilizzo funziona anche con altre annotazioni, ho usato come @KafkaListener {topics = "# {'$ {ArrayProperty}'. split (',')}"} per spring
kafka

32

Ecco un esempio di come puoi farlo in Spring 4.0+

application.properties soddisfare:

some.key=yes,no,cancel

Codice Java:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);

questo è quello che voglio, ma in env vars ... dovrei essere in grado di usare SOME_KEY_0_ = yes SOME_KEY_1 = no, ecc. in env vars, ma il mio getProperty tornerà null
Rabarbaro

0

Con uno Spring Boot si può fare quanto segue:

application.properties

values[0]=abc
values[1]=def

Classe di configurazione

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@ConfigurationProperties
public class Configuration {

    List<String> values = new ArrayList<>();

    public List<String> getValues() {
        return values;
    }

}

Questo è necessario, senza questa classe o senza la valuesclasse non funziona.

Classe dell'applicazione Spring Boot

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.List;

@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {

    private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class);

    // notice #{} is used instead of ${}
    @Value("#{configuration.values}")
    List<String> values;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootConsoleApplication.class, args);
    }

    @Override
    public void run(String... args) {
        LOG.info("values: {}", values);
    }

}

0

Se devi passare il simbolo dell'asterisco, devi racchiuderlo tra virgolette.

Nel mio caso, devo configurare cors per websocket. Quindi, ho deciso di inserire gli URL cors in application.yml. Per prod env userò URL specifici, ma per dev va bene usare solo *.

Nel file yml ho:

websocket:
  cors: "*"

Nella classe Config ho:

@Value("${websocket.cors}")
private String[] cors;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.