web-dev-qa-db-fra.com

Existe-t-il un moyen de spécifier une valeur de propriété par défaut dans Spring XML?

Nous utilisons un PropertyPlaceholderConfigurer pour utiliser Java) dans notre configuration Spring ( détails ici )

par exemple:

<foo name="port">
  <value>${my.server.port}</value>
</foo>

Nous aimerions ajouter une propriété supplémentaire, mais disposer d'un système distribué où les instances existantes pourraient toutes utiliser une valeur par défaut. Existe-t-il un moyen d'éviter de mettre à jour tous nos fichiers de propriétés en indiquant une valeur par défaut dans la configuration Spring pour qu'il n'y ait pas de valeur de propriété de remplacement définie?

88
Rog

Recherchez-vous le PropertyOverrideConfigurer documenté ici

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-overrideconfigurer

PropertyOverrideConfigurer, un autre post-processeur de fabrique de beans, est similaire à PropertyPlaceholderConfigurer, mais contrairement à ce dernier, les définitions d'origine peuvent avoir des valeurs par défaut ou aucune valeur pour les propriétés de bean. Si un fichier de propriétés de remplacement ne contient pas d'entrée pour une certaine propriété de bean, la définition de contexte par défaut est utilisée.

14
JoseK

Spring 3 prend en charge ${my.server.port:defaultValue} syntaxe.

268
lexicore

Il existe une fonctionnalité peu connue, ce qui rend encore mieux. Vous pouvez utiliser une valeur par défaut configurable au lieu d'une valeur codée en dur, voici un exemple:

config.properties:

timeout.default=30
timeout.myBean=60

context.xml:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>config.properties</value>
    </property>
</bean>

<bean id="myBean" class="Test">
    <property name="timeout" value="${timeout.myBean:${timeout.default}}" />
</bean>

Pour utiliser la valeur par défaut tout en pouvant toujours remplacer facilement par la suite, procédez comme suit dans config.properties:

timeout.myBean = ${timeout.default}
27
Michael Böckling
<foo name="port">
   <value>${my.server.port:8088}</value>
</foo>

devrait fonctionner pour vous d'avoir 8088 comme port par défaut

Voir aussi: http://blog.callistaenterprise.se/2011/11/17/configure-your-spring-web-application/

22
Uberto

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html souligne que les "propriétés locales" définies sur le bean lui-même seront considérées par défaut comme remplacées par des valeurs lues à partir de fichiers :

<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  <property name="location"><value>my_config.properties</value></property>  
  <property name="properties">  
    <props>  
      <prop key="entry.1">123</prop>  
    </props>  
  </property>  
</bean> 
8

La valeur par défaut peut être suivie d'un : après la clé de propriété, par exemple.

<property name="port" value="${my.server.port:8080}" />

Ou dans Java:

@Value("${my.server.port:8080}")
private String myServerPort;

Voir:

Par ailleurs, le opérateur Elvis est uniquement disponible dans le langage d’expression de printemps (SpEL),
exemple: https://stackoverflow.com/a/37706167/537554

7
ryenus