@ Değer isteğe bağlı olarak nasıl tanımlanır


119

Bahar fasulyesinde aşağıdakilere sahibim:

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

Değer doğru şekilde enjekte edildi. Ancak, değişkenin isteğe bağlı olması gerekir, bir komut satırı parametresi olarak iletilir (daha sonra bir SimpleCommandLinePropertySource kullanılarak Spring bağlamına eklenir ) ve bu bağımsız değişken her zaman mevcut olmayacaktır.

Varsayılan bir değer sağlamak için aşağıdakilerin ikisini de denedim:

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

ancak her durumda, iki nokta üst üste işaretinden sonraki varsayılan bağımsız değişken, gerçek bir değer olsa bile enjekte edilir - bu, Spring'in enjekte etmesi gereken şeyi geçersiz kılar gibi görünür.

@Değer'in gerekli olmadığını belirtmenin doğru yolu nedir ?

Teşekkürler


Bu çok garip ... varsayılan değer yalnızca varsayılan değer olarak hareket etmelidir (yani özellik tanımlanmadığında). "Gerçek bir değer olsa bile varsayılan değer enjekte edilir" ifadenizi iki kez kontrol edebilir misiniz (örn. Eski bir derlenmiş sınıf yoksa)?
Pavel Horal

7
@Value("${some.prop:}")benim için çalışıyor. Bu değişkendeki tek Ek Açıklama budur.
Zerdüşt

Uygulama yapılandırmanızı gönderebilir misiniz?
Vladimir Vagaytsev

@Autowired (gerekli = yanlış)?
Andrew Scott Evans

Yanıtlar:


179

@Değer'in gerekli olmadığını belirtmenin doğru yolu nedir?

'Gerekli değil' derken demek istediğin varsayımı üzerinde çalışıyorum null...

Bir :karakterin sağına varsayılan bir değer sağlayabileceğinizi doğru bir şekilde not ettiniz . Senin örneğin öyleydi @Value("${myValue:DEFAULT}").

Varsayılan değerler olarak düz dizelerle sınırlı değilsiniz. SPEL ifadelerini kullanabilirsiniz ve geri dönmek için basit bir SPEL ifadesi null:

@Value("${myValue:#{null}}")

49

Java 8 kullanıyorsanız, java.util.Optionalsınıfından yararlanabilirsiniz . Değişkeni şu şekilde bildirmeniz yeterlidir:

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

Ardından, değerin daha güzel bir şekilde tanımlanıp tanımlanmadığını kontrol edebilirsiniz:

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

Umarım yardımcı olur!


4
IntelliJ fikrine göre. OptionalSınıf alanlarında türleri kullanmak en iyi uygulama değildir .
Fırat KÜÇÜK

2
Bunu yaparsınız ve bir NPE atar. valueboş.
aatk

1
@aatk Anlattığınız sorun en az 4.3.13'ten beri giderilmiş görünüyor. Açıklanan beyanı kullanmakta sorun yaşamıyorum. Boş verilebilir
Torben

2
"IntelliJ fikrine göre. Sınıf alanlarında İsteğe Bağlı türleri kullanmak en iyi uygulama değildir." Örnek değişkeni olarak İsteğe bağlı kullanmanın yanlışlığı nedir? sadece alıcılarda kullanıldığında görece uzun ömürlüdür ... ve bu alan serileştirme için Geçici olarak işaretlenmelidir?
Andrey M. Stepanov
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.