web-dev-qa-db-fra.com

Puis-je définir la valeur null comme valeur par défaut pour une @Value au printemps?

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

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

Cela met une chaîne vide dans la variable si l'attribut n'est pas présent. Je voudrais avoir null comme valeur par défaut au lieu d'une chaîne vide. Bien entendu, je souhaite également éviter une erreur lorsque la propriété stuff.value n'est pas définie.

81
Kevin Schmidt

Vous devez définir la valeur nullValue de PropertyPlaceholderConfigurer . Pour l'exemple, j'utilise la chaîne @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>

Maintenant, vous pouvez utiliser la chaîne @null pour représenter la valeur null

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

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

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

Testé avec Spring 3.1.1

59
nosebrain

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

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

Voir cette question .

139
ben3000

Merci à @vorburger:

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

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

23
Kirill Ch

J'accorde du crédit à @nosebrain car je ne connaissais pas la "valeur nulle" mais je préfère éviter d'utiliser des valeurs nulles, d'autant plus qu'il est difficile de représenter null dans un fichier de propriétés.

Mais voici une alternative utilisant null avec out null-value donc ça marchera avec tout espace réservé 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 mon chemin car peut-être que plus tard, vous voulez stuff.value être une valeur séparée par des virgules ou peut-être que Enum le commutateur est plus facile. C'est aussi plus facile à tester un peu :)

EDIT: basé sur vos commentaires sur l'utilisation des énumérations et mon opinion de ne pas utiliser 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 null. Si vos fichiers de propriétés veulent définir explicitement qu'ils ne veulent pas le gérer, alors vous le faites (), mais vous n'avez même pas à le spécifier, car NOTSET ).

crap=NOTSET

null est très mauvais et différent de NOTSET. Cela signifie que le test du ressort ou de l’unité n’a pas été réglé, raison pour laquelle il existe une différence à mon humble avis. J'utiliserais probablement encore la notation setter (exemple précédent) pour faciliter le test unitaire (les variables privées sont difficiles à définir dans un test unitaire).

0
Adam Gent