2014-11-13 12 views
15

Inizialmente, ho le seguenti specifiche:Come specificare correttamente un valore predefinito nell'annotazione Spring @Value?

@Value("#{props.isFPL}") 
private boolean isFPL=false; 

Questo funziona bene correttamente ottenere il valore dal file di proprietà:

isFPL = true 

Tuttavia, la seguente espressione con risultati di default l'errore:

@Value("#{props.isFPL:false}") 
private boolean isFPL=false; 

L'analisi delle espressioni non è riuscita; l'eccezione annidata è org.springframework.expression.spel.SpelParseException: EL1041E: (pos 28): Dopo l'analisi di un'espressione valida, c'è ancora di più i dati nell'espressione: 'due punti (:)'

Ho provato anche a usa $ invece di #.

@Value("${props.isFPL:true}") 
private boolean isFPL=false; 

Quindi il valore di default in annotazione funziona bene, ma non ho avuto il valore corretto dal file delle proprietà:

+0

Con '# {}' Si tratta di un'espressione, con '$ {}' è un segnaposto per un valore. La prima espressione che usi chiamerà un metodo/attributo su un bean chiamato oggetti di scena, quello con il segnaposto tenterà di localizzare una proprietà chiamata "props.isFPL" in "Ambiente". Dovresti usare quest'ultimo e probabilmente stai caricando le tue proprietà nel modo sbagliato. –

+0

Grazie. Se carico le proprietà nel modo sbagliato perché # {} preleva il valore corretto? –

+0

Perché quella è un'espressione non un segnaposto. Sono entrambi valutati in modi completamente diversi. –

risposta

17

Prova con $ come segue

@Value("${props.isFPL:true}") 
private boolean isFPL=false; 

anche fare in modo di impostare il ignore-resource-no-found to true in modo che se il file delle proprietà è mancante, verrà preso il valore predefinito.

Inoltre, inserire il seguente in -

il file di contesto se si utilizza la configurazione basata xm:

<context:property-placeholder ignore-resource-not-found="true"/> 

nella classe di configurazione Se si utilizza configurazioni Java:

@Bean 
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
    PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer(); 
    p.setIgnoreResourceNotFound(true); 

    return p; 
} 
+1

Il mio problema con $ non sta ignorando un valore predefinito. Il problema è che il valore del file delle proprietà viene ignorato –

+0

Come stai caricando il file delle proprietà? – shi9

1

dipende da come stai caricando le tue proprietà, se usi qualcosa come

<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />

Poi @Value dovrebbe essere simile

@Value("${isFPL:true}") 
2

Il vostro file di contesto dell'applicazione Primavera contiene più di un fagioli propertyPlaceholder come di seguito:

<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true" location="classpath*:/*.local.properties" /> 
<context:property-placeholder location="classpath:/config.properties" /> 

Se è così, allora ricerca immobili per: puntelli. isFPL avrà luogo solo per il primo file di proprietà (.local.properties), se la proprietà non viene trovata, il valore predefinito (true) avrà effetto e il secondo file di proprietà (config.properties) viene effettivamente ignorato per questa proprietà.

2

Per variabile int Tipo:

@Value("${my.int.config: #{100}}") 
int myIntConfig; 

Nota: non c'è spazio prima i due punti, ma uno spazio extra dopo i due punti.

1

per una stringa è possibile difetto a null in questo modo:

public UrlTester(@Value("${testUrl:}") String url) { 
    this.url = url; 
}