Ich möchte eine Liste von Werten in einer .properties-Datei haben, dh:
my.list.of.strings=ABC,CDE,EFG
Und um es direkt in meine Klasse zu laden, dh:
@Value("${my.list.of.strings}")
private List<String> myList;
Soweit ich weiß, besteht eine Alternative dazu darin, es in der Spring-Konfigurationsdatei zu haben und es als Bean-Referenz zu laden (korrigieren Sie mich, wenn ich falsch liege), d. H.
<bean name="list">
<list>
<value>ABC</value>
<value>CDE</value>
<value>EFG</value>
</list>
</bean>
Aber gibt es eine Möglichkeit, dies zu tun? Verwenden Sie eine .properties-Datei? ps: Ich möchte dies nach Möglichkeit ohne benutzerdefinierten Code tun.
java
spring
spring-properties
JackDev
quelle
quelle
org.springframework.expression.spel.SpelEvaluationException
Ausnahme und nichtjavax.el.ELException
. Wird Ihr Objekt von Spring erstellt?my.list.of.strings=
? Ich würde erwarten, dass eine solche Funktionalität eine leere Liste neu ausführt, wo es sich hier um ein Element (leere Zeichenfolge) handelt, nicht wahr?item1, item2, item3
möglicherweise zu Ergebnissen führen, die Sie nicht wirklich erwarten (Hinweis: Leerzeichen).@Value("#{'${my.list.of.strings}'.split(',\\s*')}")
Seit Spring 3.0 können Sie eine Zeile wie hinzufügen
zu Ihrem
applicationContext.xml
(oder wo Sie Dinge konfigurieren). Wie Dmitry Chornyi in einem Kommentar hervorhebt, sieht die Java-basierte Konfiguration folgendermaßen aus:Dadurch wird der neue Konfigurationsdienst aktiviert, der die Konvertierung unterstützt
String
inCollection
Typen unterstützt. Wenn Sie diesen Konfigurationsdienst nicht aktivieren, greift Spring auf seine älteren Eigenschafteneditoren als Konfigurationsdienste zurück, die diese Art der Konvertierung nicht unterstützen.Das Konvertieren in Sammlungen anderer Typen funktioniert ebenfalls:
wird mit einer Linie wie arbeiten
Keine Probleme mit Leerzeichen da, das
ConversionServiceFactoryBean
kümmert sich darum.Siehe http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config
quelle
split()
in jedem Ausdruck wiederholen müssen , wird auch eine leere Liste ordnungsgemäß behandelt, anstatt Sie[null]
Wenn Sie dies lesen und Spring Boot verwenden , haben Sie 1 weitere Option für diese Funktion
Normalerweise sind durch Kommas getrennte Listen für den realen Anwendungsfall sehr ungeschickt (und manchmal nicht einmal machbar, wenn Sie in Ihrer Konfiguration Kommas verwenden möchten):
Mit Spring Boot können Sie es wie folgt schreiben (Index beginnt bei 0):
Und benutze es wie folgt:
quelle
Durch Angabe der
my.list.of.strings=ABC,CDE,EFG
Datei in .properties und Verwendung@Value("${my.list.of.strings}")
private String[] myString;
Sie können die Arrays von Strings erhalten. Mit
CollectionUtils.addAll(myList, myString)
können Sie die Liste der Zeichenfolgen abrufen.quelle
Haben Sie darüber nachgedacht,
@Autowired
den Konstrukteur oder einen SetterString.split()
in den Körper zu bringen?Ich bevorzuge es, mein Autowiring auf eine dieser Arten durchzuführen, um die Testbarkeit meines Codes zu verbessern.
quelle
Wenn Sie Spring Boot 2 verwenden, funktioniert es ohne zusätzliche Konfiguration unverändert.
quelle
private List<String> myList;
Alle obigen Antworten sind richtig. Sie können dies jedoch in nur einer Zeile erreichen. Bitte versuchen Sie die folgende Deklaration und Sie erhalten alle durch Kommas getrennten Werte in einer String-Liste.
Außerdem muss in Ihrer XML-Konfiguration die folgende Zeile definiert sein.
Ersetzen Sie einfach den Pfad und den Dateinamen Ihrer Eigenschaftendatei. Und du bist gut zu gehen. :) :)
Hoffe das hilft dir. Prost.
quelle
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings}')}")
Wenn Sie die neueste Spring Framework-Version verwenden (Spring 3.1+, glaube ich), müssen Sie diese Zeichenfolgen in SpringEL nicht teilen.
Fügen Sie einfach PropertySourcesPlaceholderConfigurer und DefaultConversionService zu Ihrer Spring's Configuration-Klasse hinzu (die mit Configuration versehene Klasse), z.
und in deiner Klasse
und in der Eigenschaftendatei
Ohne DefaultConversionService können Sie einen durch Kommas getrennten String nur dann in ein String-Array einfügen, wenn Sie den Wert in Ihr Feld einfügen. DefaultConversionService erledigt jedoch einige praktische Aufgaben für Sie und fügt diese in Collection, Array usw. hinzu (überprüfen Sie die Implementierung, wenn Sie dies möchten möchte mehr darüber wissen)
Mit diesen beiden werden sogar alle redundanten Leerzeichen einschließlich Zeilenumbruch verarbeitet, sodass Sie keine zusätzlichen Logiken hinzufügen müssen, um sie zu kürzen.
quelle
Sie können dies mit solchen Anmerkungen tun
Hier wird my.list.of.strings aus der Eigenschaftendatei ausgewählt. Wenn es nicht vorhanden ist, werden die Standardeinstellungen a, b, c verwendet
und in Ihrer Eigenschaftendatei können Sie so etwas haben
my.list.of.strings = d, e, f
quelle
Achten Sie auf Leerzeichen in den Werten. Ich könnte mich irren, aber ich denke, Leerzeichen in der durch Kommas getrennten Liste werden nicht mit @Value und Spel abgeschnitten. Die Liste
würde als Liste von Zeichenfolgen eingelesen werden
In den meisten Fällen würden Sie wahrscheinlich die Räume nicht wollen!
Der Ausdruck
würde Ihnen eine Liste von Zeichenfolgen geben:
Der reguläre Ausdruck entfernt alle Leerzeichen kurz vor und kurz nach einem Komma. Leerzeichen innerhalb der Werte werden nicht entfernt. So
sollte zu Werten führen
quelle
@Value("#{'${foobar}'.trim().split( *, *)}")
Ich denke, dies ist einfacher, um das Array zu greifen und Leerzeichen zu entfernen:
quelle
In meinem Fall einer Liste von ganzen Zahlen funktioniert dies:
Eigenschaftendatei:
quelle
Erwägen Sie die Verwendung der Commons-Konfiguration. Es hat eine integrierte Funktion, um einen Eintrag in der Eigenschaftendatei in Array / Liste zu unterteilen. Das Kämmen mit SpEL und @Value sollte das geben, was Sie wollen
Wie gewünscht, ist hier, was Sie brauchen (Ich habe den Code nicht wirklich ausprobiert, habe möglicherweise Tippfehler, bitte nehmen Sie Kontakt mit mir auf):
In der Apache Commons-Konfiguration gibt es PropertiesConfiguration. Es unterstützt die Funktion zum Konvertieren von begrenzten Zeichenfolgen in Arrays / Listen.
Zum Beispiel, wenn Sie eine Eigenschaftendatei haben
Mit dem folgenden Code:
gibt Ihnen ein String-Array von
["bar1", "bar2", "bar3"]
Um dies mit Spring zu verwenden, haben Sie dies in Ihrem App-Kontext xml:
und haben dies in Ihrer Frühlingsbohne:
Ich glaube, das sollte funktionieren: P.
quelle
Mein bevorzugter Weg (insbesondere für Strings) ist der folgende:
und verwenden
Auf diese Weise können Sie auch Kommas in Ihren Parameter aufnehmen. Es funktioniert auch für Sets.
quelle
Wenn Sie Platzhalter für Eigenschaften verwenden, wird das Beispiel ser1702544
Mit Platzhalter xml:
quelle
Ich benutze Spring Boot 2.2.6
Meine Eigenschaftendatei:
Mein Code:
Es funktioniert gut
quelle