Dapatkah saya menetapkan null sebagai nilai default untuk @Value di Musim Semi?

100

Saat ini saya menggunakan anotasi @Value Spring 3.1.x seperti ini:

@Value("${stuff.value:}")
private String value;

Ini menempatkan String kosong ke dalam variabel jika atribut tidak ada. Saya ingin memiliki null sebagai default, bukan String kosong. Tentu saja saya juga ingin menghindari error saat property stuff.value tidak diset.

Kevin Schmidt
sumber

Jawaban:

66

Anda harus menyetel nullValue dari PropertyPlaceholderConfigurer . Sebagai contoh saya menggunakan string @nulltetapi Anda juga dapat menggunakan string kosong sebagai nullValue.

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <!-- config the location(s) of the properties file(s) here -->
    <property name="nullValue" value="@null" />
</bean>

Sekarang Anda dapat menggunakan string @nulluntuk mewakili nullnilainya

@Value("${stuff.value:@null}")
private String value;

Harap diperhatikan: Ruang nama konteks tidak mendukung nilai null saat ini. Anda tidak bisa menggunakan

<context:property-placeholder null-value="@null" ... />

Diuji dengan Spring 3.1.1

mimisan
sumber
2
Apa yang setara dengan konfigurasi Java ini?
Kumar Sambhav
30
stackoverflow.com/questions/9347929/… menyebutkan menggunakan $ {some.param: # {null}}, dan itu bekerja untuk saya tanpa harus menyetel nullValue, tampaknya ini adalah defaultnya? (Dalam aplikasi Spring Boot.)
vorburger
5
Kekuatan penggunaan sederhana dari SPEL $ {stuff.value: # {null}} seperti yang disarankan oleh vorburger dan di stackoverflow.com/questions/16735141/…
csf
tampaknya konfigurasi yang jauh lebih sedikit diperlukan untuk jawaban ben3000 dan JRichardsz.
Jeff
198

Ini benar-benar tua, tetapi Anda dapat menggunakan Spring EL sekarang, misalnya

@Value("${stuff.value:#{null}}")

Lihat pertanyaan ini .

ben3000
sumber
52

Terima kasih kepada @vorburger:

@Value("${email.protocol:#{null}}")
String protocol;

akan menyetel nilai string ke null tanpa konfigurasi lain.

Kirill Ch
sumber
3
bekerja di musim semi-boot terakhir 2019 versi: 2.1.7.RELEASE ... start.spring.io
JRichardsz
2

Saya memberikan kredit @nosebrain karena saya tidak tahu tentang "nilai-nol" tetapi saya lebih suka menghindari menggunakan nilai-nilai nol sama sekali terutama karena sulit untuk mewakili nulldalam file properti.

Tapi di sini adalah alternatif menggunakan null tanpa null-valuesehingga akan bekerja dengan placeholder properti apa pun.

public class MyObject {

   private String value;

   @Value("${stuff.value:@null}")
   public void setValue(String value) {
      if ("@null".equals(value)) this.value = null;
      else this.value = value;
   }
}

Secara pribadi saya lebih suka cara saya karena mungkin nanti Anda ingin stuff.valuemenjadi nilai dipisahkan Koma atau mungkin untuk Enum beralih lebih mudah. Ini juga lebih mudah untuk menguji unit :)

EDIT: berdasarkan komentar Anda tentang penggunaan enum dan pendapat saya tentang tidak menggunakan null.

@Component
public class MyObject {

    @Value("${crap:NOTSET}")
    private Crap crap;

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

Di atas berfungsi dengan baik untuk saya. Anda menghindari nol. Jika file properti Anda ingin menetapkan secara eksplisit bahwa mereka tidak ingin menanganinya maka Anda harus melakukannya ( tetapi Anda bahkan tidak perlu menentukan ini karena akan default ke NOTSET ).

crap=NOTSET

nullsangat buruk dan berbeda dari NOTSET. Itu berarti pegas atau uji unit tidak mengaturnya, itulah sebabnya ada IMHO perbedaan. Saya mungkin masih akan menggunakan notasi penyetel (contoh sebelumnya) karena lebih mudah untuk pengujian unit (variabel pribadi sulit untuk ditetapkan dalam pengujian unit).

Adam Gent
sumber
Nilai String adalah contohnya, saya sangat membutuhkan ini untuk nilai Enum, di mana String kosong hanya menyebabkan kesalahan konversi. Dengan @null Anda dapat memiliki null sebagai "tanpa set Enum", yang saya butuhkan.
Kevin Schmidt
Semua alasan mengapa saya tidak akan merekomendasikan null melainkan beberapa enum yang mewakili tidak ditetapkan.
Adam Gent
2
Itu akan membutuhkan penempatan Enum.NOTSET ke dalam semua file properti (> 30), yang tampaknya banyak pekerjaan dengan hampir tidak ada manfaat ...
Kevin Schmidt
Saya belum mencoba ini tetapi secara teori tidak akan @Value("${stuff.value:NOTSET}")berhasil?
Adam Gent
Ya, ini adalah solusi yang bagus. Sayangnya saya tidak bisa mengubah enum (dep), jadi saya harus menggunakan null. Jika tidak, Anda benar, NOTSET akan berfungsi.
Kevin Schmidt
0

Jika Anda perlu memasukkan string kosong (0 panjang) "" sebagai @Value default - gunakan SPEL (bahasa ekspresi pegas) sebagai berikut:

@Value("${index.suffix:#{''}}") 
private String indexSuffix;

# {''} hanya memberi Anda string kosong sebagai nilai default @ Value yang dimasukkan.

oleh yl

ylev
sumber