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?
Recherchez-vous le PropertyOverrideConfigurer documenté ici
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.
Spring 3 prend en charge ${my.server.port:defaultValue}
syntaxe.
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}
<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/
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>
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:
valueSeparator
(de AbstractPropertyResolver
)
et VALUE_SEPARATOR
(de SystemPropertyUtils
)
Par ailleurs, le opérateur Elvis est uniquement disponible dans le langage d’expression de printemps (SpEL),
exemple: https://stackoverflow.com/a/37706167/537554