Baharda bir @Değer için varsayılan değer olarak null ayarlayabilir miyim?


105

Şu anda @Value Spring 3.1.x ek açıklamasını şu şekilde kullanıyorum:

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

Bu, öznitelik yoksa değişkene boş bir String koyar. Varsayılan olarak boş bir Dize yerine null olmasını istiyorum. Tabii ki, stuff.value özelliği ayarlanmadığında da bir hatadan kaçınmak istiyorum.

Yanıtlar:


67

PropertyPlaceholderConfigurer öğesinin nullValue değerini ayarlamanız gerekir . Örnek için dizeyi kullanıyorum @nullancak boş dizeyi nullValue olarak da kullanabilirsiniz.

<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>

Artık değeri @nulltemsil etmek için dizeyi kullanabilirsiniznull

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

Lütfen dikkat: Bağlam adı alanı şu anda boş değeri desteklemiyor. Kullanamazsın

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

Spring 3.1.1 ile test edildi


2
Bunun Java yapılandırma eşdeğeri nedir?
Kumar Sambhav

31
stackoverflow.com/questions/9347929/… $ {some.param: # {null}} kullanarak bahseder ve bu, nullValue ayarlamak zorunda kalmadan benim için işe yaradı, bunun varsayılan olduğu görünüyor? (Bir Spring Boot uygulamasında.)
vorburger

5
csf

ben3000 ve JRichardsz yanıtları için çok daha az yapılandırma gerekli görünüyor.
Jeff

206

Bu gerçekten eskidir, ancak artık Spring EL'i kullanabilirsiniz, örn.

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

Bu soruya bakın .


56

@Vorburger'e teşekkürler:

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

dize değerini başka hiçbir yapılandırma olmadan null olarak ayarlar .


3
ilkbahar-boot son 2019 sürümünde çalıştı: 2.1.7.RELEASE ... start.spring.io
JRichardsz

2

"Null-value" hakkında bilmediğim için @nosebrain kredisi veriyorum, ancak özellikle nullbir özellikler dosyasında gösterilmesi zor olduğu için boş değerleri kullanmaktan kaçınmayı tercih ediyorum .

Ama burada null kullanarak bir alternatif var, null-valuebu yüzden ne olursa olsun özellik yer tutucusu ile çalışacak.

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;
   }
}

Şahsen ben kendi yolumu tercih ederim çünkü belki daha sonra stuff.valueVirgülle ayrılmış bir değer olmak istersiniz veya belki de Enum'a geçiş daha kolaydır. Birim testi yapmak da daha kolay :)

DÜZENLEME: numaralandırmaları kullanma konusundaki yorumlarınıza ve boş kullanmama fikrime göre.

@Component
public class MyObject {

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

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

Yukarıdakiler benim için iyi çalışıyor. Boşluktan kaçınırsınız. Mülk dosyalarınız, işlemek istemediklerini açık bir şekilde ayarlamak istiyorsa, o zaman siz yaparsınız ( ancak bunu varsayılan olarak NOTSET olarak belirtmeniz gerekmez ).

crap=NOTSET

nullçok kötü ve farklı NOTSET. Bu, yay veya birim testinin ayarlanmadığı anlamına gelir, bu yüzden IMHO bir fark vardır. Yine de muhtemelen daha kolay birim testi olarak ayarlayıcı gösterimini (önceki örnek) kullanırdım (özel değişkenlerin bir birim testinde ayarlanması zordur).


String değeri bir örnekti, buna bir Enum değeri için gerçekten ihtiyacım vardı, burada boş bir String sadece bir dönüşüm hatasına neden oluyor. @Null ile "Enum set yok" olarak null değerine sahip olabilirsiniz, bu da ihtiyacım olan şeydir.
Kevin Schmidt

Null önermemem için daha fazla neden, bunun yerine set olmadığını temsil eden bir enum.
Adam Gent

2
Yani (> 30), hemen hemen hiç faydaları ile çok çalışma görünüyor ... tüm özellikler dosyalar halinde Enum.NOTSET koyarak gerektirecektir
Kevin Schmidt

Bunu denemedim ama teoride @Value("${stuff.value:NOTSET}")işe yaramaz mı?
Adam Gent

Evet, bu iyi bir çözüm. Maalesef numaralandırmayı (dep) değiştiremiyorum, bu yüzden null ile gitmem gerekiyor. Aksi takdirde haklısınız, NOTSET çalışacaktır.
Kevin Schmidt

0

@Değer varsayılan olarak boş bir (0 uzunluk) "" ​​dizesi eklemeniz gerekirse, SPEL'i (yay ifade dili) aşağıdaki gibi kullanın:

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

# {''} size sadece @ Değerin varsayılanı olarak boş bir dize getirir.

yl ile

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.