2012-08-16 16 views

Odpowiedz

46

Należy ustawić wartość null wartości PropertyPlaceholderConfigurer. Dla przykładu używam ciągu @null, ale możesz również użyć pustego ciągu jako wartości 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żna użyć ciągu @null do reprezentowania wartości null

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

Uwaga: przestrzeń nazw kontekst nie obsługuje wartość null w tym momencie. Nie można używać

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

Testowane z wiosny 3.1.1

+2

Co to jest odpowiednik w konfiguracji Java? –

+18

http://stackoverflow.com/questions/9347929/spring-set-a-property-only-if-the-value-is-not-null wspomina o użyciu $ {some.param: # {null}}, a także pracował dla mnie bez konieczności ustawiania wartości nullValue, wydaje się, że jest to ustawienie domyślne? (W aplikacji Spring Boot.) – vorburger

+3

Proste użycie SPEL $ {stuff.value: # {null}} zgodnie z sugestią vorburgera oraz w http://stackoverflow.com/questions/16735141/specify-default-property- value-as-null-in-spring – csf

2

daję @nosebrain kredyt, bo nie wiedział o „zerowej wartości”, ale ja wolę unikać wartości null całkowicie szczególnie od jego trudne do reprezentowania null w pliku właściwości.

Ale tutaj jest alternatywa przy użyciu wartości null bez numeru null-value, więc będzie działać z dowolnym obiektem zastępczym.

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ę moją drogę, bo może później chcesz stuff.value być oddzielone przecinkami wartości lub być może do ENUM przełącznik jest łatwiejsze. Jest także łatwiejszy w testowaniu jednostkowym :)

EDYCJA: na podstawie twoich komentarzy na temat używania wyrażeń 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 wartości zerowej. Jeśli twoje pliki właściwości chcą jawnie ustawić, że nie chcą tego obsługiwać, robisz to (, ale nie musisz nawet tego określać, ponieważ będzie domyślnie NOTSET).

crap=NOTSET 

null jest bardzo złe i jest inna niż NOTSET. Oznacza to, że wiosna lub test jednostkowy go nie ustawiły, dlatego istnieje IMHO różnica. Nadal prawdopodobnie używałbym notacji settera (poprzedni przykład), ponieważ jest to łatwiejsze do testowania jednostkowego (prywatne zmienne są trudne do ustawienia w teście jednostkowym).

+0

Wartość String była przykładem, naprawdę potrzebowałem tego dla wartości wyliczenia, gdzie pusty łańcuch powoduje tylko błąd konwersji. Z @ null możesz mieć wartość zerową jako "bez zestawu wyliczeniowego", co jest tym, czego potrzebuję. –

+0

To jeszcze jeden powód, dla którego nie zaleciłbym wartości zerowej, ale zamiast tego niektóre wyliczenia, które nie są ustawione. –

+0

Wymagałoby to umieszczenia Enum.NOTSET we wszystkich plikach właściwości (> 30), co wydaje się być dużo pracy bez prawie żadnych korzyści ... –

61

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

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

Zobacz this question.

4

Dzięki @vorburger:

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

ustawi wartość łańcuchową na zerową bez żadnych innych konfiguracjach.

Powiązane problemy