Chcę mieć listę wartości w pliku .properties, tj .:
my.list.of.strings=ABC,CDE,EFG
Aby załadować go bezpośrednio do mojej klasy, tj .:
@Value("${my.list.of.strings}")
private List<String> myList;
Jak rozumiem, alternatywą takiego postępowania jest umieszczenie go w wiosennym pliku konfiguracyjnym i załadowanie go jako odwołania do komponentu bean (popraw mnie, jeśli się mylę), tj.
<bean name="list">
<list>
<value>ABC</value>
<value>CDE</value>
<value>EFG</value>
</list>
</bean>
Ale czy jest na to sposób? używasz pliku .properties? ps: Chciałbym to zrobić bez kodu niestandardowego, jeśli to możliwe.
java
spring
spring-properties
JackDev
źródło
źródło
org.springframework.expression.spel.SpelEvaluationException
wyjątek i niejavax.el.ELException
. Czy Twój obiekt został stworzony przez Spring?my.list.of.strings=
? Oczekiwałbym, że taka funkcjonalność ponownie przestraszy pustą listę, gdzie tutaj będzie jeden element (pusty ciąg), prawda?item1, item2, item3
mogą dać wynik, którego tak naprawdę nie oczekujesz (wskazówka: spacje).@Value("#{'${my.list.of.strings}'.split(',\\s*')}")
Od wiosny 3.0 możesz dodać linię podobną do
do twojego
applicationContext.xml
(lub gdzie konfigurujesz rzeczy). Jak zauważa Dmitry Chornyi w komentarzu, konfiguracja oparta na Javie wygląda następująco:Aktywuje to nową usługę konfiguracji, która obsługuje konwersję
String
naCollection
typy. Jeśli nie aktywujesz tej usługi konfiguracji, Spring powróci do swoich starszych edytorów właściwości jako usług konfiguracji, które nie obsługują tego rodzaju konwersji.Działa również konwersja do kolekcji innych typów:
będzie działać z linią podobną do
Nie ma problemów z białymi znakami,
ConversionServiceFactoryBean
dba o to.Zobacz http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config
źródło
split()
w każdym wyrażeniu, poprawnie obsługuje pustą listę zamiast dać ci[null]
Jeśli czytasz to i używasz Spring Boot , masz 1 dodatkową opcję dla tej funkcji
Zazwyczaj lista oddzielona przecinkami jest bardzo nieporęczna w przypadku użycia w świecie rzeczywistym (a czasami nawet niewykonalne, jeśli chcesz używać przecinków w konfiguracji):
W Spring Boot możesz to napisać w następujący sposób (Początek indeksu od 0):
I użyj tego w następujący sposób:
źródło
Określając
my.list.of.strings=ABC,CDE,EFG
plik .properties i używając@Value("${my.list.of.strings}")
private String[] myString;
Możesz uzyskać tablice ciągów. I za pomocą
CollectionUtils.addAll(myList, myString)
możesz uzyskać listę ciągów.źródło
Czy rozważałeś
@Autowired
wprowadzenie konstruktora lub setera iString.split()
wtopienie się w ciało?Wolę robić autowire na jeden z tych sposobów, aby zwiększyć testowalność mojego kodu.
źródło
Jeśli używasz Spring Boot 2, działa tak, jak jest, bez dodatkowej konfiguracji.
źródło
private List<String> myList;
Wszystkie powyższe odpowiedzi są poprawne. Ale możesz to osiągnąć w jednej linii. Spróbuj wykonać następującą deklarację, a otrzymasz wszystkie wartości oddzielone przecinkami na liście ciągów.
Musisz także zdefiniować następujący wiersz w konfiguracji xml.
wystarczy zastąpić ścieżkę i nazwę pliku właściwości. I jesteś gotowy iść. :)
Mam nadzieję, że to ci pomoże. Twoje zdrowie.
źródło
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings}')}")
Jeśli używasz najnowszej wersji Spring Framework (uważam, że Spring 3.1+), nie potrzebujesz tych elementów rozdzielających ciąg w SpringEL,
Po prostu dodaj PropertySourcesPlaceholderConfigurer i DefaultConversionService do klasy konfiguracji Springa (tej z adnotacją do konfiguracji), np.
i w twojej klasie
oraz w pliku właściwości
Bez DefaultConversionService możesz wstawić ciąg rozdzielany przecinkami do tablicy String, gdy wstrzykniesz wartość do swojego pola, ale DefaultConversionService zrobi dla ciebie kilka dogodnych magii i doda je do Collection, Array itp. (Sprawdź implementację, jeśli chcesz lubię wiedzieć o tym więcej)
Dzięki tym dwóm obsługuje nawet wszystkie nadmiarowe białe znaki, w tym znak nowej linii, więc nie trzeba dodawać dodatkowych elementów logicznych, aby je przyciąć.
źródło
możesz to zrobić za pomocą takich adnotacji
tutaj moja.list.of.strings zostanie wybrana z pliku właściwości, jeśli go nie ma, zostaną użyte wartości domyślne a, b, c
a w pliku właściwości możesz mieć coś takiego
moja.lista.strun = d, e, f
źródło
Uważaj na spacje w wartościach. Mogę się mylić, ale myślę, że spacje na liście oddzielonej przecinkami nie są obcinane za pomocą @Value i Spel. Lista
zostanie odczytany jako lista ciągów
W większości przypadków prawdopodobnie nie chcesz spacji!
Ekspresja
dałby ci listę ciągów:
Wyrażenie regularne usuwa wszystkie spacje tuż przed przecinkiem i tuż po nim. Spacje wewnątrz wartości nie są usuwane. Więc
powinno dawać wartości
źródło
@Value("#{'${foobar}'.trim().split( *, *)}")
Myślę, że łatwiej jest chwytać tablicę i usuwać spacje:
źródło
W moim przypadku działa lista liczb całkowitych:
Plik właściwości:
źródło
Rozważ użycie konfiguracji Commons. Ma wbudowaną funkcję przerywania wpisu w pliku właściwości do tablicy / listy. Czesanie ze SpEL i @Value powinno dać ci to, czego chcesz
Zgodnie z prośbą, oto czego potrzebujesz (naprawdę nie wypróbowałem kodu, może mam kilka błędów, proszę o wyrozumiałość):
W konfiguracji Apache Commons istnieje PropertiesConfiguration. Obsługuje funkcję konwertowania łańcucha rozdzielanego na tablicę / listę.
Na przykład, jeśli masz plik właściwości
Z poniższym kodem:
da ci tablicę ciągów
["bar1", "bar2", "bar3"]
Aby używać z Springem, należy mieć to w kontekście swojej aplikacji xml:
i miej to w swojej fasoli wiosennej:
Uważam, że to powinno działać: P
źródło
Mój preferowany sposób (w szczególności dla ciągów znaków) jest następujący:
I użyć
W ten sposób możesz dodać przecinki do swojego parametru. Działa również w przypadku zestawów.
źródło
jeśli użyjesz symboli zastępczych właściwości, wówczas będzie to przykład ser1702544
Z symbolem zastępczym xml:
źródło
Używam Spring Boot 2.2.6
Mój plik właściwości:
Mój kod:
To działa dobrze
źródło