Saya ingin memiliki daftar nilai dalam file .properties, yaitu:
my.list.of.strings=ABC,CDE,EFG
Dan untuk memuatnya di kelas saya secara langsung, yaitu:
@Value("${my.list.of.strings}")
private List<String> myList;
Seperti yang saya mengerti, alternatif melakukan ini adalah untuk memilikinya di file konfigurasi musim semi, dan memuatnya sebagai referensi kacang (koreksi saya jika saya salah), yaitu
<bean name="list">
<list>
<value>ABC</value>
<value>CDE</value>
<value>EFG</value>
</list>
</bean>
Tetapi apakah ada cara untuk melakukan ini? menggunakan file .properties? ps: Saya ingin melakukan ini tanpa kode khusus jika memungkinkan.
java
spring
spring-properties
JackDev
sumber
sumber
org.springframework.expression.spel.SpelEvaluationException
pengecualian dan tidakjavax.el.ELException
. Apakah keberatan Anda dibuat oleh Spring?my.list.of.strings=
? Saya harapkan fungsi seperti itu menyusun kembali daftar kosong di mana ini akan menjadi satu item (string kosong), bukan?item1, item2, item3
dapat memberi Anda hasil yang tidak Anda harapkan (petunjuk: spasi).@Value("#{'${my.list.of.strings}'.split(',\\s*')}")
Sejak Spring 3.0, Anda dapat menambahkan garis seperti
ke
applicationContext.xml
(atau di mana Anda mengkonfigurasi hal-hal). Seperti yang ditunjukkan Dmitry Chornyi dalam komentar, konfigurasi berbasis Java terlihat seperti:Ini mengaktifkan layanan konfigurasi baru yang mendukung konversi
String
keCollection
tipe. Jika Anda tidak mengaktifkan layanan konfigurasi ini, Spring mengandalkan editor properti lawasnya sebagai layanan konfigurasi, yang tidak mendukung konversi semacam ini.Konversi ke koleksi jenis lain juga berfungsi:
akan bekerja dengan garis seperti
Tidak ada masalah dengan spasi putih di sana,
ConversionServiceFactoryBean
mengurusnya.Lihat http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config
sumber
split()
dalam setiap ekspresi, itu juga benar menangani daftar kosong bukannya memberi Anda[null]
Jika Anda membaca ini dan Anda menggunakan Spring Boot , Anda memiliki 1 opsi lagi untuk fitur ini
Biasanya daftar yang dipisahkan koma sangat canggung untuk kasus penggunaan dunia nyata (Dan kadang-kadang bahkan tidak layak, jika Anda ingin menggunakan koma di konfigurasi Anda):
Dengan Spring Boot , Anda dapat menulis seperti ini (Indeks mulai dari 0):
Dan gunakan seperti ini:
sumber
Dengan menentukan
my.list.of.strings=ABC,CDE,EFG
file in .properties dan menggunakan@Value("${my.list.of.strings}")
private String[] myString;
Anda bisa mendapatkan array string. Dan menggunakan
CollectionUtils.addAll(myList, myString)
, Anda bisa mendapatkan daftar string.sumber
Sudahkah Anda mempertimbangkan
@Autowired
konstruktor atau setter danString.split()
ing dalam tubuh?Saya cenderung lebih suka melakukan autowiring saya dalam salah satu cara ini untuk meningkatkan testabilitas kode saya.
sumber
Jika Anda menggunakan Spring Boot 2, itu berfungsi apa adanya, tanpa konfigurasi tambahan.
sumber
private List<String> myList;
Semua jawaban di atas benar. Tetapi Anda dapat mencapai ini hanya dalam satu baris. Silakan coba deklarasi berikut ini dan Anda akan mendapatkan semua nilai yang dipisahkan koma dalam daftar String.
Dan juga Anda harus memiliki baris berikut yang ditentukan dalam konfigurasi xml Anda.
cukup ganti jalur dan nama file dari file properti Anda. Dan Anda baik untuk pergi. :)
Semoga ini bisa membantu Anda. Bersulang.
sumber
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings}')}")
Jika Anda menggunakan versi Spring framework terbaru (Spring 3.1+ saya percaya), Anda tidak perlu hal-hal string split di SpringEL,
Cukup tambahkan PropertySourcesPlaceholderConfigurer dan DefaultConversionService di kelas Konfigurasi Spring Anda (yang dengan penjelasan dengan Konfigurasi) misalnya,
dan di kelasmu
dan di file properti
Tanpa DefaultConversionService, Anda hanya dapat mengambil String yang dipisahkan koma ke dalam array String ketika Anda menyuntikkan nilai ke bidang Anda, tetapi DefaultConversionService melakukan beberapa keajaiban yang mudah bagi Anda dan akan menambahkannya ke dalam Collection, Array, dll. (Periksa implementasinya jika Anda ingin ingin tahu lebih banyak tentang itu)
Dengan keduanya, ini bahkan menangani semua spasi putih berlebihan termasuk baris baru, jadi Anda tidak perlu menambahkan logika tambahan untuk memotongnya.
sumber
Anda dapat melakukan ini dengan anotasi seperti ini
di sini my.list.of.strings akan diambil dari file properti, jika tidak ada, maka default a, b, c akan digunakan
dan di file properti Anda, Anda dapat memiliki sesuatu seperti ini
my.list.of.strings = d, e, f
sumber
Waspadalah terhadap spasi dalam nilai. Saya bisa saja salah, tapi saya pikir spasi di daftar yang dipisahkan koma tidak terpotong menggunakan @Value dan Spel. Daftar
akan dibaca sebagai daftar string
Dalam kebanyakan kasus, Anda mungkin tidak ingin spasi!
Ekspresi
akan memberi Anda daftar string:
Ekspresi reguler menghapus semua spasi sebelum dan sesudah koma. Spasi di dalam nilai tidak dihapus. Begitu
harus menghasilkan nilai
sumber
@Value("#{'${foobar}'.trim().split( *, *)}")
Saya pikir ini lebih mudah untuk meraih array dan stripping space:
sumber
Dalam kasus saya daftar bilangan bulat berfungsi sebagai berikut:
File properti:
sumber
Pertimbangkan untuk menggunakan Konfigurasi Commons. Ini memiliki fitur bawaan untuk memecah entri dalam file properti ke array / daftar. Menyisir dengan SpEL dan @Value akan memberikan apa yang Anda inginkan
Seperti yang diminta, inilah yang Anda butuhkan (Belum benar-benar mencoba kode, mungkin mendapat beberapa kesalahan ketik, mohon ikut saya):
Di Konfigurasi Apache Commons, ada PropertiesConfiguration. Ini mendukung fitur konversi string terbatas ke array / daftar.
Misalnya, jika Anda memiliki file properti
Dengan kode di bawah ini:
akan memberi Anda array string
["bar1", "bar2", "bar3"]
Untuk digunakan dengan Spring, dapatkan ini dalam konteks aplikasi Anda xml:
dan memilikinya di kacang musim semi Anda:
Saya percaya ini harus berhasil: P
sumber
Cara pilihan saya (untuk string, khususnya), adalah yang berikut:
dan gunakan
Dengan cara ini, Anda dapat memasukkan juga koma di parameter Anda. Ini juga berfungsi untuk Set.
sumber
jika menggunakan placeholder properti maka contoh ser1702544 akan menjadi
Dengan placeholder xml:
sumber
Saya menggunakan Spring Boot 2.2.6
File properti saya:
Kode saya:
Ini bekerja dengan baik
sumber