Come definire @Value come opzionale


119

Ho quanto segue in un fagiolo primaverile:

@Value("${myValue}")
private String value;

Il valore viene iniettato correttamente. Tuttavia, la variabile deve essere facoltativa, viene passata come parametro della riga di comando (che viene quindi aggiunto al contesto Spring utilizzando un SimpleCommandLinePropertySource ) e questo argomento non esisterà sempre.

Ho provato entrambi i seguenti per fornire un valore predefinito:

@Value("${myValue:}")
@Value("${myValue:DEFAULT}")

ma in ogni caso, l'argomento predefinito dopo i due punti viene inserito anche quando c'è un valore effettivo: questo sembra sovrascrivere ciò che Spring dovrebbe iniettare.

Qual è il modo corretto per specificare che @Value non è richiesto?

Grazie


Questo è molto strano ... il valore predefinito dovrebbe agire solo come valore predefinito (cioè quando la proprietà non è definita). Puoi ricontrollare la tua dichiarazione "il valore predefinito viene inserito anche quando c'è un valore effettivo" (ad esempio se non c'è una vecchia classe compilata)?
Pavel Horal

7
@Value("${some.prop:}")funziona per me. Questa è l'unica annotazione su quella variabile.
Zarathustra

Puoi pubblicare la configurazione dell'applicazione?
Vladimir Vagaytsev

@Autowired (obbligatorio = false)?
Andrew Scott Evans

Risposte:


179

Qual è il modo corretto per specificare che @Value non è richiesto?

Partendo dal presupposto che per 'non richiesto' intendi nullallora ...

Hai notato correttamente che puoi fornire un valore predefinito a destra di un :personaggio. Il tuo esempio è stato @Value("${myValue:DEFAULT}").

Non sei limitato a stringhe semplici come valori predefiniti. Puoi usare espressioni SPEL e una semplice espressione SPEL da restituire nullè:

@Value("${myValue:#{null}}")

49

Se stai usando Java 8, puoi sfruttare la sua java.util.Optionalclasse. Devi solo dichiarare la variabile in questo modo:

@Value("${myValue:#{null}}")
private Optional<String> value;

Quindi, puoi verificare se il valore è definito o meno in un modo migliore:

if (value.isPresent()) {
    // do something cool
}

Spero che sia d'aiuto!


4
Secondo intelliJ idea. Non è consigliabile utilizzare i Optionaltipi nei campi classe.
Fırat KÜÇÜK

2
Lo fai e genera un NPE. valueè zero.
aatk

1
@aatk Sembra che il problema che descrivi sia stato risolto almeno dalla 4.3.13. Non ho problemi a usare la dichiarazione descritta. Anche se è meglio usare solo un valore nullable: blog.joda.org/2015/08/…
Torben

2
"Secondo l'idea di intelliJ. Non è una best practice utilizzare i tipi opzionali nei campi delle classi." cosa c'è di sbagliato nell'usare Opzionale come variabile di istanza? solo che è relativamente longevo rispetto a quando viene utilizzato nei getter ... e tale campo dovrebbe essere contrassegnato come Transient per la serializzazione?
Andrey M. Stepanov
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.