Spring .properties-Datei: Element als Array abrufen

90

Ich lade Eigenschaftenattribute .propertiesmit Spring wie folgt aus einer Datei:

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

Die Spring-XML-Datei

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

Und meine Class.java

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

Beim Debuggen erhalten die Parameterelemente jedoch nur das letzte Element in der Liste. Daher gibt es eine Liste mit einem Element mit dem Wert "6" anstelle einer Liste mit 6 Elementen.

Ich habe andere Ansätze ausprobiert, z. B. nur das Hinzufügen von Wert, #{base.module}aber dann findet es keinen Parameter in der Eigenschaftendatei.

Eine Problemumgehung besteht darin, in der Datei elements.properties eine durch Kommas getrennte Liste zu haben, z.

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

und benutze es als String und analysiere es, aber gibt es eine bessere Lösung?

RamonBoza
quelle
Daher muss ich es als durch Kommas getrennte Zeichenfolge übergeben und die Methode analysieren.
RamonBoza
Genau, obwohl es einige Bibliotheken gibt, die das bereits für Sie tun (Apache Commons) - commons.apache.org/configuration/howto_properties.html
Colin Hebert
Hier ist eine Antwort, die Ihnen zumindest ein Set <String> -Ergebnis liefert. Nicht ganz eine Liste <String>, aber wahrscheinlich in vielen Fällen ausreichend! stackoverflow.com/questions/5274362/…
John Rix

Antworten:

186

Wenn Sie Ihr Array in einer Eigenschaftendatei wie folgt definieren:

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

Sie können ein solches Array wie folgt in Ihre Java-Klasse laden:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
svlada
quelle
5
Meine Elemente enthalten Komma. Wie entkomme ich dem Trennzeichen? '\,' sogar '\\,' funktionieren nicht.
BanterCZ
Sie können versuchen, sie als Ganzzahlliste abzurufen und sie dann zu konvertieren @Value ("$ {base.module.elementToSearch}") private List <Integer> elementToSearch;
Gal Bracha
+1, genau das, was ich brauchte. Leider List<String>scheint es nicht zu funktionieren, durch Kommas getrennte Werte auf dieselbe Weise in a zu lesen (die Liste enthält nur ein Element).
Jonik
4
Ich kann bestätigen, dass die Verwendung String[]als Typ funktioniert, während die Verwendung List<String>nicht funktioniert.
Wim Deblauwe
2
Wenn Sie dies Arbeit mit wollen List<String>statt String[], müssen Sie mindestens eine hinzufügen , <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">um Ihre applicationContext.xml. Andernfalls wird der Konvertierungsdienst nicht verwendet, sondern die Standardeigenschaftseditoren, die das Konvertieren von Strings in Sammlungen nicht unterstützen, nur Arrays: docs.spring.io/spring/docs/current/spring-framework-reference/…
Clemens Klein-Robbenhaar
35

Und wenn Sie ein anderes Trennzeichen als Komma haben, können Sie dies auch verwenden.

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

und

in Ihren Anwendungseigenschaften, die Sie haben könnten

my.config.values=value1, value2, value3
RK Punjal
quelle
Diese Verwendung funktioniert auch mit anderen Anmerkungen, die ich wie @KafkaListener {topic = "# {'$ {ArrayProperty}'. split (',')}"} für den Spring Kafka Listener
AsyncTask
31

Hier ist ein Beispiel, wie Sie dies in Spring 4.0+ tun können

application.properties Inhalt:

some.key=yes,no,cancel

Java Code:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);
Juha Hanka
quelle
Dies ist, was ich will, aber in env vars ... Ich sollte in der Lage sein, SOME_KEY_0_ = yes SOME_KEY_1 = no usw. in env vars zu verwenden, aber meine getProperty kommt null zurück
Rhabarber
0

Mit einem Spring Boot kann man folgendes machen:

application.properties

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

Konfigurationsklasse

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;
    }

}

Dies ist erforderlich, ohne diese Klasse oder ohne die values In-Klasse funktioniert es nicht.

Spring Boot-Anwendungsklasse

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);
    }

}
Betlista
quelle
0

Wenn Sie das Sternsymbol übergeben müssen, müssen Sie es in Anführungszeichen setzen.

In meinem Fall muss ich cors für Websockets konfigurieren. Also habe ich beschlossen, cors URLs in application.yml zu setzen. Für prod env verwende ich bestimmte URLs, aber für dev ist es in Ordnung, nur * zu verwenden.

In der yml-Datei habe ich:

websocket:
  cors: "*"

In der Konfigurationsklasse habe ich:

@Value("${websocket.cors}")
private String[] cors;
Ruslan Sheremet
quelle