Czy mogę ustawić wartość null jako domyślną wartość @Value na wiosnę?


100

Obecnie używam adnotacji @Value Spring 3.1.x w następujący sposób:

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

Spowoduje to umieszczenie w zmiennej pustego ciągu znaków, jeśli atrybut nie jest obecny. Chciałbym mieć wartość null jako domyślną zamiast pustego ciągu. Oczywiście chcę również uniknąć błędu, gdy właściwość stuff.value nie jest ustawiona.

Odpowiedzi:


66

Należy ustawić nullValue PropertyPlaceholderConfigurer . Na przykład używam ciągu, @nullale możesz również użyć pustego ciągu jako 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>

Teraz możesz użyć ciągu @nulldo reprezentowania nullwartości

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

Uwaga: przestrzeń nazw kontekstu nie obsługuje obecnie wartości null. Nie możesz użyć

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

Testowane za pomocą Spring 3.1.1


2
Jaki jest odpowiednik konfiguracji Java?
Kumar Sambhav

30
stackoverflow.com/questions/9347929/… wspomina o użyciu $ {some.param: # {null}}, a to zadziałało dla mnie bez konieczności ustawiania nullValue, wydaje się, że jest to ustawienie domyślne? (W aplikacji Spring Boot.)
vorburger

5
Prosta moc użycia SPEL $ {stuff.value: # {null}} zgodnie z sugestią vorburgera i stackoverflow.com/questions/16735141/ ...
csf

wydaje się, że dla odpowiedzi ben3000 i JRichardsz wymagana jest znacznie mniejsza konfiguracja.
Jeff

198

To jest naprawdę stare, ale teraz możesz używać Spring EL, np

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

Zobacz to pytanie .


52

Dzięki @vorburger:

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

ustawi wartość ciągu na null bez żadnych innych konfiguracji.


3
pracował wiosną-boot ostatnia wersja 2019: 2.1.7.RELEASE ... start.spring.io
JRichardsz

2

Daję zasługę @nosebrain, ponieważ nie wiedziałem o „wartości null”, ale wolę całkowicie unikać używania wartości null, szczególnie, że jest to trudne do przedstawienia nullw pliku właściwości.

Ale tutaj jest alternatywa używania null bez out, null-valuewięc będzie działać z każdym symbolem zastępczym właściwości.

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

Osobiście wolę mój sposób, ponieważ może później chcesz stuff.valuebyć wartością oddzieloną przecinkami lub może do Enum, przełącznik jest łatwiejszy. Test jednostkowy jest również łatwiejszy :)

EDYCJA: na podstawie twoich komentarzy na temat używania wyliczeń i mojej opinii o nieużywaniu null.

@Component
public class MyObject {

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

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

Powyższe działa dobrze dla mnie. Unikasz null. Jeśli pliki właściwości chcą wyraźnie ustawić, że nie chcą tego obsługiwać, to robisz ( ale nie musisz nawet tego określać, ponieważ domyślnie będzie to NOTSET ).

crap=NOTSET

nulljest bardzo zły i różni się od NOTSET. Oznacza to, że test sprężynowy lub jednostkowy nie ustawił tego, dlatego IMHO jest różnica. Nadal prawdopodobnie użyłbym notacji ustawiającej (poprzedni przykład) jako łatwiejszego do przetestowania jednostkowego (zmienne prywatne są trudne do ustawienia w teście jednostkowym).


Wartość String była przykładem, naprawdę potrzebowałem tego dla wartości Enum, gdzie pusty ciąg powoduje tylko błąd konwersji. Z @null możesz mieć wartość null jako „brak zestawu wyliczenia”, czego potrzebuję.
Kevin Schmidt

Tym bardziej nie polecałbym wartości null, ale zamiast tego wyliczenie, które reprezentuje nieustawiony.
Adam Gent,

2
Wymagałoby to oddanie Enum.NOTSET do wszystkich właściwości plików (> 30), co wydaje się dużo pracy z prawie żadnych korzyści ...
Kevin Schmidt

Nie próbowałem tego, ale teoretycznie nie @Value("${stuff.value:NOTSET}")zadziała?
Adam Gent,

Tak, to dobre rozwiązanie. Niestety nie mogę zmienić wyliczenia (dep), więc muszę iść z null. W przeciwnym razie masz rację, NOTSET zadziała.
Kevin Schmidt

0

Jeśli chcesz wstawić pusty (0 długości) "" ciąg jako domyślny @Value - użyj SPEL (język wyrażeń wiosennych) w następujący sposób:

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

# {''} po prostu pobiera pusty ciąg jako domyślny wstrzyknięty @ Value.

przez yl

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.