web-dev-qa-db-fra.com

Comment spécifier correctement une valeur par défaut dans l'annotation Spring @Value?

Au départ, j'ai les spécifications suivantes:

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

Cela fonctionne correctement en obtenant la valeur du fichier de propriétés:

isFPL = true

Cependant, l'expression suivante avec default entraîne l'erreur:

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

L'analyse de l'expression a échoué. L'exception imbriquée est org.springframework.expression.spel.SpelParseException: EL1041E: (pos 28): après l'analyse d'une expression valide, il reste encore des données dans l'expression: 'colon (:)'

J'ai aussi essayé d'utiliser $ au lieu de #. 

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

Ensuite, la valeur par défaut dans les annotations fonctionne bien mais je n’ai pas obtenu la valeur correcte dans le fichier de propriétés:

20
Alex

Essayez avec $ comme suit

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

assurez-vous également que vous définissez ignore-resource-no-found sur true afin que, si le fichier de propriétés est manquant, la valeur par défaut soit prise.

Placez également les éléments suivants dans -

le fichier de contexte si vous utilisez une configuration basée sur xm: 

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

dans la classe de configuration Si vous utilisez des configurations Java:

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

    return p;
 }
22
shi9

Pour la variable de type int:

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

Remarque: il n'y a pas d'espace avant le colon, mais un espace supplémentaire après le colon.

5
Kevin Liu

Votre fichier de contexte d'application Spring contient-il plusieurs beans propertyPlaceholder comme ci-dessous:

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

Si tel est le cas, la recherche de propriété pour: props.isFPL n'aura lieu que pour le premier fichier de propriétés ( .local.properties ); si propriété non trouvée, la valeur par défaut ( true ) prend effet et le second fichier de propriété ( config.properties ) est ignoré pour cette propriété.

2
Kevin

Pour une chaîne, vous pouvez définir la valeur null par défaut de la manière suivante:

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

Dépend de la façon dont vous chargez vos propriétés, si vous utilisez quelque chose comme

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

Alors @Value devrait ressembler à

@Value("${isFPL:true}")
1
Mike Summers