Comment définir @Value comme facultatif


119

J'ai ce qui suit dans un haricot de printemps:

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

La valeur est correctement injectée. Cependant, la variable doit être facultative, elle est transmise en tant que paramètre de ligne de commande (qui est ensuite ajouté au contexte Spring à l'aide d'un SimpleCommandLinePropertySource ), et cet argument n'existera pas toujours.

J'ai essayé les deux méthodes suivantes afin de fournir une valeur par défaut:

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

mais dans chaque cas, l'argument par défaut après les deux-points est injecté même s'il y a une valeur réelle - cela semble remplacer ce que Spring devrait injecter.

Quelle est la manière correcte de spécifier que @Value n'est pas obligatoire?

Merci


C'est très étrange ... la valeur par défaut ne devrait agir que comme valeur par défaut (c'est-à-dire lorsque la propriété n'est pas définie). Pouvez-vous vérifier votre déclaration "la valeur par défaut est injectée même s'il y a une valeur réelle" (par exemple s'il n'y a pas une ancienne classe compilée)?
Pavel Horal

7
@Value("${some.prop:}")fonctionne pour moi. C'est la seule annotation sur cette variable.
Zarathustra

Pouvez-vous publier la configuration de votre application?
Vladimir Vagaytsev

@Autowired (obligatoire = faux)?
Andrew Scott Evans

Réponses:


179

Quelle est la manière correcte de spécifier que @Value n'est pas obligatoire?

En partant du principe que par `` non requis '' vous entendez nullalors ...

Vous avez correctement noté que vous pouvez fournir une valeur par défaut à droite d'un :caractère. Votre exemple était @Value("${myValue:DEFAULT}").

Vous n'êtes pas limité aux chaînes simples comme valeurs par défaut. Vous pouvez utiliser des expressions SPEL , et une expression SPEL simple à renvoyer nullest:

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

49

Si vous utilisez Java 8, vous pouvez profiter de sa java.util.Optionalclasse. Il vous suffit de déclarer la variable de cette façon:

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

Ensuite, vous pouvez vérifier si la valeur est définie ou non d'une manière plus agréable:

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

J'espère que ça aide!


4
Selon l'idée intelliJ. Il n'est pas recommandé d'utiliser des Optionaltypes dans les champs de classe.
Fırat KÜÇÜK

2
Vous faites cela et il jette un NPE. valueest nul.
aatk

1
@aatk Il semble que le problème que vous décrivez a été résolu au moins depuis la version 4.3.13. Je n'ai aucun problème à utiliser la déclaration décrite. Bien qu'il soit préférable d'utiliser simplement une valeur nullable
Torben

2
"Selon l'idée intelliJ. Il n'est pas recommandé d'utiliser des types facultatifs dans les champs de classe." qu'est-ce qui ne va pas dans l'utilisation de Optional comme variable d'instance? seulement cela est relativement long par rapport à lorsqu'il est utilisé dans les getters ... et un tel champ doit être marqué Transient pour la sérialisation?
Andrey M. Stepanov
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.