2015-06-29 13 views
8

Nella Spring 4, utilizzando l'annotazione @Value, qual è il modo corretto per specificare una proprietà di sistema come predefinita se una proprietà specificata non esiste?Spring 4 @Value dove proprietà default è una proprietà di sistema java

considerando che lavora per il caso no-default:

@Value("${myapp.temp}") 
private String tempDirectory; 

questo non funziona quando ho bisogno di un default:

@Value("#{myapp.temp ?: systemProperties.java.io.tmpdir}") 
private String tempDirectory; 

Né questo:

@Value("#{myapp.temp ?: systemProperties(java.io.tmpdir)}") 
private String tempDirectory; 

Entrambe mi danno un'eccezione nel momento in cui Spring sta cercando di creare il bean:

org.springframework.beans.factory.BeanCreationException: Error creating bean 
    with name 'configurationService': Invocation of init method failed; 
    nested exception is java.lang.NullPointerException 

Questo può essere fatto?

+0

Come funziona? – chrylis

+0

@chrylis - Spring genera un'eccezione quando si tenta di creare il bean. Ho modificato la domanda per essere più esplicita. –

+0

Hai una "eccezione annidata", che presumibilmente ha informazioni utili. Pubblica la traccia * whole * stack. – chrylis

risposta

8

Ho provato quanto segue e ha funzionato per me:

@Value("${myapp.temp:#{systemProperties['java.io.tmpdir']}}") 
private String tempDirectory; 

Le parti mancanti per te credo che non stava usando ?: e che necessitano di #{}. In base a questo answer:

${...} è la sintassi del segnaposto della proprietà. Può essere utilizzato solo per le proprietà di dereferenziazione.

#{...} è la sintassi SpEL, che è molto più capace e complessa. Può anche gestire segnaposto di proprietà e molto altro ancora.

Quindi, in pratica ciò che sta accadendo è che stiamo dicendo Primavera di interpretare prima come sintassi di proprietà segnaposto utilizzando la sintassi ${}. Quindi usiamo : invece di ?: (che è chiamato Elvis operator) poiché l'operatore elvis si applica solo alle espressioni di Spring Expression Language, non alla sintassi di segnaposto di proprietà. La terza parte della nostra dichiarazione è #{systemProperties['java.io.tmpdir']} che sta dicendo a Spring di interpretare la prossima espressione come una espressione di primavera e ci consente di ottenere le proprietà di sistema.

+0

Chiaro, informativo e preciso - Grazie! –

+2

Non hai bisogno di SpEL per questo.'@Value (" $ {myapp.temp: $ {java.io.tmpdir}} ") funziona uniformemente .. –

1

Prova systemProperties['java.io.tmpdir'].

E 'una mappa, quindi se la chiave ha un punto nel nome, è necessario utilizzare [..]

0

Per me funziona solo con differenti proprietà-nomi (essendo chiave property.name.aa con un valore nei miei application.properties e property.name.ba Ambiente-variabile) come:

@Value("${property.name.a:${property.name.b}}") 

Il stessi nomi non ha funzionato per me come previsto (caricamento predefinito, quando la prima proprietà non è presente), ad esempio:

@Value("${property.name.a:${property.name.a}}") 
Problemi correlati