139 votes

Puis-je définir null comme valeur par défaut pour une @Value dans Spring ?

J'utilise actuellement l'annotation @Value de Spring 3.1.x comme ceci :

@Value("${stuff.value:}")
private String value;

Cela place une chaîne vide dans la variable si l'attribut n'est pas présent. J'aimerais que null soit la valeur par défaut au lieu d'une chaîne vide. Bien sûr, je veux aussi éviter une erreur lorsque la propriété stuff.value n'est pas définie.

293voto

Naib Points 46

C'est vraiment vieux, mais vous pouvez utiliser Spring EL maintenant, par exemple.

@Value("${stuff.value:#{null}}")

Ver cette question .

77voto

Kirill Ch Points 1461

Merci à @vorburger :

@Value("${email.protocol:#{null}}")
String protocol;

définira la valeur de la chaîne à null sans aucune autre configuration.

76voto

nosebrain Points 358

Vous devez définir la nullValue de la balise PropertyPlaceholderConfigurer . Pour l'exemple, j'utilise la chaîne de caractères @null mais vous pouvez également utiliser la chaîne vide comme nullValue.

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <!-- config the location(s) of the properties file(s) here -->
    <property name="nullValue" value="@null" />
</bean>

Vous pouvez maintenant utiliser la chaîne @null pour représenter le null valeur

@Value("${stuff.value:@null}")
private String value;

Remarque : l'espace de nom du contexte ne prend pas en charge la valeur nulle pour le moment. Vous ne pouvez pas utiliser

<context:property-placeholder null-value="@null" ... />

Testé avec Spring 3.1.1

2voto

Adam Gent Points 15055

Je reconnais à @nosebrain que je ne connaissais pas la "null-value", mais je préfère éviter d'utiliser des valeurs nulles, notamment parce qu'elles sont difficiles à représenter. null dans un fichier de propriétés.

Mais voici une alternative utilisant la nullité sans null-value afin qu'il fonctionne avec n'importe quel substitut de propriété.

public class MyObject {

   private String value;

   @Value("${stuff.value:@null}")
   public void setValue(String value) {
      if ("@null".equals(value)) this.value = null;
      else this.value = value;
   }
}

Personnellement, je préfère ma façon de faire parce que peut-être que plus tard tu voudras stuff.value pour être une valeur séparée par des virgules ou peut-être un Enum, le changement est plus facile. C'est aussi plus facile à tester en unité :)

MODIFICATION : en fonction de vos commentaires sur l'utilisation des enums et de mon opinion sur la non-utilisation de null.

@Component
public class MyObject {

    @Value("${crap:NOTSET}")
    private Crap crap;

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

Ce qui précède fonctionne bien pour moi. Vous évitez les null. Si vos fichiers de propriétés veulent explicitement définir qu'ils ne veulent pas le gérer alors vous faites ( mais il n'est même pas nécessaire de le spécifier car la valeur par défaut est NOTSET. ).

crap=NOTSET

null est très mauvais et est différent de NOTSET . Cela signifie que Spring ou le test unitaire ne l'a pas défini, c'est pourquoi il y a, à mon avis, une différence. Je continuerais probablement à utiliser la notation setter (exemple précédent) car elle est plus facile à tester en unité (les variables privées sont difficiles à définir dans un test unitaire).

1voto

ylev Points 658

Si vous avez besoin d'injecter une chaîne vide (longueur 0) "" comme valeur par défaut @Value - utilisez SPEL (langage d'expression de printemps) comme suit :

@Value("${index.suffix:#{''}}") 
private String indexSuffix;

{''} vous donne juste une chaîne vide comme valeur par défaut de l'@Value injectée.

par yl

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X