Bagaimana mendefinisikan @Value sebagai opsional

119

Saya memiliki yang berikut di Spring bean:

@Value("${myValue}")
private String value;

Nilai diinjeksikan dengan benar. Namun, variabel harus opsional, ia diteruskan sebagai parameter baris perintah (yang kemudian ditambahkan ke konteks Spring menggunakan SimpleCommandLinePropertySource ), dan argumen ini tidak akan selalu ada.

Saya telah mencoba kedua hal berikut untuk memberikan nilai default:

@Value("${myValue:}")
@Value("${myValue:DEFAULT}")

tetapi dalam setiap kasus, argumen default setelah titik dua dimasukkan bahkan ketika ada nilai sebenarnya - ini muncul menggantikan apa yang harus dimasukkan Spring.

Apa cara yang benar untuk menentukan bahwa @Value tidak diperlukan?

Terima kasih

pengguna1052610
sumber
Itu sangat aneh ... nilai default harus bertindak sebagai nilai default saja (yaitu ketika properti tidak ditentukan). Dapatkah Anda memeriksa ulang pernyataan Anda "nilai default disuntikkan bahkan ketika ada nilai aktual" (misalnya jika tidak ada kelas terkompilasi lama)?
Pavel Horal
7
@Value("${some.prop:}")bekerja untuk saya. Itu adalah satu-satunya Penjelasan pada variabel itu.
Zarathustra
Dapatkah Anda memposting konfigurasi aplikasi Anda?
Vladimir Vagaytsev
@Autowired (wajib = false)?
Andrew Scott Evans

Jawaban:

179

Apa cara yang benar untuk menentukan bahwa @Value tidak diperlukan?

Bekerja dengan asumsi bahwa dengan 'tidak diperlukan' yang Anda maksud nullmaka ...

Anda telah mencatat dengan benar bahwa Anda dapat memberikan nilai default di sebelah kanan :karakter. Contoh Anda adalah @Value("${myValue:DEFAULT}").

Anda tidak terbatas pada string biasa sebagai nilai default. Anda dapat menggunakan ekspresi SPEL , dan ekspresi SPEL sederhana untuk dikembalikan nulladalah:

@Value("${myValue:#{null}}")
Andy Brown
sumber
49

Jika Anda menggunakan Java 8, Anda dapat memanfaatkan java.util.Optionalkelasnya. Anda hanya perlu mendeklarasikan variabel dengan cara ini:

@Value("${myValue:#{null}}")
private Optional<String> value;

Kemudian, Anda dapat memeriksa apakah nilainya ditentukan atau tidak dengan cara yang lebih baik:

if (value.isPresent()) {
    // do something cool
}

Semoga membantu!

alonso_50
sumber
4
Menurut ide intelliJ. Ini bukan praktik terbaik untuk menggunakan Optionaltipe di bidang kelas.
Fırat KÜÇÜK
2
Anda melakukan ini dan itu melempar NPE. valueadalah nol.
aatk
1
@aatk Tampaknya masalah yang Anda gambarkan telah diperbaiki setidaknya sejak 4.3.13. Saya tidak mendapatkan masalah dalam menggunakan deklarasi yang dijelaskan. Meskipun lebih baik menggunakan nilai nullable: blog.joda.org/2015/08/…
Torben
2
"Menurut ide intelliJ. Ini bukan praktik terbaik untuk menggunakan tipe Opsional di bidang kelas." apa yang salah tentang menggunakan Opsional sebagai variabel contoh? hanya itu yang berumur relatif lama dibandingkan ketika digunakan di getter ... dan bidang seperti itu harus ditandai Transient untuk serialisasi?
Andrey M. Stepanov