2012-08-16 20 views
54

Attualmente sto usando l'annotazione 3.1.x @Value Spring simili:Posso impostare null come valore predefinito per un @Value in primavera?

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

Questo mette una stringa vuota nella variabile se l'attributo non è presente. Mi piacerebbe avere null come predefinito invece di una stringa vuota. Ovviamente voglio anche evitare un errore quando la proprietà stuff.value non è impostata.

risposta

46

È necessario impostare il valore nullo dello PropertyPlaceholderConfigurer. Per l'esempio sto usando la stringa @null ma puoi anche usare la stringa vuota come 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> 

Ora è possibile utilizzare la stringa @null per rappresentare il valore null

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

Si prega di notare: Lo spazio nome del contesto non supporta il valore nullo in questo momento. Non è possibile utilizzare

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

testato con molla 3.1.1

+2

Qual è l'equivalente della configurazione Java di questo? –

+18

http://stackoverflow.com/questions/9347929/spring-set-a-property-only-if-the-value-is-not-null menziona utilizzando $ {some.param: # {null}}, e ha funzionato per me senza dover impostare nullValue, sembra che questo sia l'impostazione predefinita? (In un'applicazione Spring Boot.) – vorburger

+3

Potere uso semplice di SPEL $ {stuff.value: # {null}} come suggerito da vorburger e in http://stackoverflow.com/questions/16735141/specify-default-property- value-as-null-in-spring – csf

2

dò @nosebrain di credito come io non conoscevo "null-value" ma preferisco evitare di utilizzare i valori nulli del tutto particolare perché la sua Difficile rappresentare null in un file di proprietà.

Ma qui è un'alternativa che utilizza null con fuori null-value in modo che funzioni con qualsiasi segnaposto di proprietà.

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

Personalmente preferisco la mia strada perché magari in seguito si desidera stuff.value di essere un-comma-separated value o forse per ENUM l'interruttore è più facile. È anche più facile da testare :)

EDIT: in base ai commenti sull'utilizzo di enumerazioni e la mia opinione di non utilizzare null.

Quanto sopra funziona bene per me. Eviti nullo. Se i tuoi file di proprietà vogliono impostare esplicitamente che non vogliono gestirli, allora lo fai (ma non devi nemmeno specificarlo perché verrà impostato su NOTSET).

crap=NOTSET 

null è molto male ed è diverso da quello NOTSET. Significa che la primavera o il test di unità non l'hanno impostato e questo è il motivo per cui c'è una differenza tra IMHO. Probabilmente userò ancora la notazione setter (esempio precedente) come più facile al test unitario (le variabili private sono difficili da impostare in un test unitario).

+0

Il valore String era un esempio, avevo davvero bisogno di questo per un valore Enum, dove una stringa vuota causa solo un errore di conversione. Con @null puoi avere un null come "no Enum set", che è quello di cui ho bisogno. –

+0

Un motivo in più per cui non consiglierei null ma invece un enum che rappresenta non impostato. –

+0

Ciò richiederebbe la collocazione di Enum.NOTSET in tutti i file di proprietà (> 30), che sembra molto lavoro con quasi nessun vantaggio ... –

61

Questo è veramente vecchio, ma ora puoi utilizzare EL primavera, ad es.

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

Vedi this question.

4

Grazie @vorburger:

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

imposterà il valore di stringa a nullo senza altre configurazioni.

Problemi correlati