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.

Kevin Schmidt
źródło

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

mózgoczaszka
źródło
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 .

ben3000
źródło
52

Dzięki @vorburger:

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

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

Kirill Ch
źródło
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).

Adam Gent
źródło
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

ylev
źródło