Posso impostare null come valore predefinito per un @Value in primavera?


100

Attualmente sto utilizzando l'annotazione @Value Spring 3.1.x in questo modo:

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

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

Risposte:


66

È necessario impostare nullValue di PropertyPlaceholderConfigurer . Per l'esempio sto usando la stringa @nullma 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 puoi usare la stringa @nullper rappresentare il nullvalore

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

Nota: lo spazio del nome del contesto non supporta il valore null al momento. Non puoi usare

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

Testato con Spring 3.1.1


2
Qual è l'equivalente della configurazione Java di questo?
Kumar Sambhav

30
stackoverflow.com/questions/9347929/… menziona l'utilizzo di $ {some.param: # {null}}, e che ha funzionato per me senza dover impostare nullValue, sembra che questo sia il valore predefinito? (In un'applicazione Spring Boot.)
vorburger

5
Potere uso semplice della SPEL $ {stuff.value: # {null}} come suggerito da Vorburger e in stackoverflow.com/questions/16735141/...
CSF

sembra che sia richiesta molta meno configurazione per le risposte ben3000 e JRichardsz.
Jeff

193

Questo è davvero vecchio, ma ora puoi usare Spring EL, ad es

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

Vedi questa domanda .


49

Grazie a @vorburger:

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

imposterà il valore della stringa su null senza altre configurazioni.


3
ha lavorato in spring-boot l'ultima versione del 2019: 2.1.7.RELEASE ... start.spring.io
JRichardsz

2

Do credito a @nosebrain perché non conoscevo il "valore nullo", ma preferisco evitare di utilizzare valori nulli del tutto, soprattutto perché è difficile da rappresentare nullin un file delle proprietà.

Ma ecco un'alternativa che utilizza null senza null-valuequindi funzionerà 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é forse in seguito vuoi stuff.valueessere un valore separato da virgole o forse per Enum il passaggio è più semplice. È anche più facile da testare :)

EDIT: in base ai tuoi commenti sull'uso di enumerazioni e alla mia opinione di non utilizzare null.

@Component
public class MyObject {

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

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

Quanto sopra funziona bene per me. Eviti null. Se i tuoi file di proprietà vogliono impostare esplicitamente che non vogliono gestirlo, allora lo fai ( ma non devi nemmeno specificarlo in quanto sarà predefinito su NOTSET ).

crap=NOTSET

nullè pessimo ed è diverso da NOTSET. Significa che il test della molla o dell'unità non l'ha impostato, motivo per cui IMHO ha una differenza. Probabilmente userò ancora la notazione setter (esempio precedente) perché è più facile da unit test (le variabili private sono difficili da impostare in uno unit test).


Il valore String era un esempio, ne avevo davvero bisogno 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 che mi serve.
Kevin Schmidt

Ragione in più per cui non consiglierei null ma invece qualche enum che rappresenta non impostato.
Adam Gent

2
Ciò richiederebbe l'inserimento di Enum.NOTSET in tutti i file delle proprietà (> 30), il che sembra un sacco di lavoro con quasi nessun vantaggio ...
Kevin Schmidt

Non l'ho provato ma in teoria non @Value("${stuff.value:NOTSET}")funzionerebbe?
Adam Gent il

Sì, questa è una buona soluzione. Sfortunatamente non posso cambiare enum (dep), quindi devo andare con null. Altrimenti hai ragione, il NOTSET funzionerebbe.
Kevin Schmidt

0

Nel caso in cui sia necessario inserire una stringa vuota (lunghezza 0) "" come valore predefinito di @Value, utilizzare SPEL (linguaggio delle espressioni primaverili) come segue:

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

# {''} ti fornisce solo una stringa vuota come predefinito di @ Value iniettato.

di yl

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.