Dans application.properties
De mon application Spring Boot, j'ai cette définition:
someProp=${SOME_ENV_VARIABLE}
Mais c'est une valeur optionnelle définie uniquement dans certains environnements, je l'utilise comme ceci
@Value("${someProp:#{null}}")
private String someProp;
Étonnamment, je reçois cette erreur lorsque l'env. var n'existe pasCould not resolve placeholder 'SOME_ENV_VARIABLE' in string value "${SOME_ENV_VARIABLE}"
Je m'attendais à ce que Spring définisse simplement une valeur vide s'il ne se trouve dans aucun PropertySource
.
Comment le rendre facultatif?
Fournissez une valeur par défaut dans le application.properties
someProp=${SOME_ENV_VARIABLE:#{null}}
Lorsqu'il est utilisé comme @Value("${someProp})
, cela sera correctement évalué à null
. Premièrement, si SOME_ENV_VARIABLE
N'est pas trouvé lorsque application.properties
Est en cours de traitement, sa valeur devient la chaîne littérale "# {null}". Ensuite, @Value
Évalue someProp
comme une expression SpEL, ce qui donne null
. La valeur réelle peut être vérifiée en regardant la propriété dans le bean Environment
.
Cette solution utilise la syntaxe de valeur par défaut spécifiée par la classe PlaceholderConfigurerSupport
Les valeurs de propriété par défaut peuvent être définies globalement pour chaque instance de configuration via la propriété properties, ou propriété par propriété en utilisant le séparateur de valeur par défaut qui est ":" par défaut et personnalisable via setValueSeparator (String).
et Expression Spring SpEL modelant .
Depuis les documents Spring Boot sur configuration externalisée
Enfin, bien que vous puissiez écrire une expression SpEL dans @Value, ces expressions ne sont pas traitées à partir des fichiers de propriétés d'application.