61 votes

Est-il possible d'avoir plusieurs PropertyPlaceHolderConfigurer dans mon applicationContext?

J'ai besoin de charger un fichier applicationContext.xml spécifique en fonction d'une propriété système donnée. Cela charge un fichier avec la configuration actuelle. Par conséquent, j'ai besoin de 2 PropertyPlaceHolderConfigurer, l'un résolvant le paramètre système et l'autre dans la configuration réelle.

Des idees pour faire cela?

82voto

flicken Points 5887

Oui, vous pouvez faire plus d'un. Assurez-vous de définir ignoreUnresolvablePlaceholders de sorte que le premier va ignorer tous les espaces qu'il ne peut pas résoudre.

<bean id="ppConfig1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="ignoreUnresolvablePlaceholders" value="true"/>
   <property name="locations">
    <list>
             <value>classpath*:/my.properties</value>
    </list>
  </property>
</bean>

<bean id="ppConfig2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="ignoreUnresolvablePlaceholders" value="false"/>
   <property name="locations">
    <list>
             <value>classpath*:/myOther.properties</value>
    </list>
  </property>
</bean>

Selon votre application, vous devez étudier systemPropertiesMode, il vous permet de charger les propriétés d'un fichier, mais de permettre les propriétés du système pour remplacer des valeurs dans le fichier de propriété si elle est définie.

7voto

Trenton Points 2315

Attention, il pourrait y avoir un bug lié à plusieurs configurateurs. Voir http://jira.springframework.org/browse/SPR-5719 pour plus de détails.

Je ne peux pas avoir plusieurs personnes pour travailler localement ... mais je ne blâme personne d'autre que moi-même.

7voto

weekens Points 2685

Une autre solution consiste à utiliser la propriété placeholderPrefix de PropertyPlaceholderConfigurer. Vous le spécifiez pour la deuxième (troisième, quatrième ...) Configurateur, puis préfixez tous vos espaces réservés correspondants, il n'y aura donc aucun conflit.

 <bean id="mySecondConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="classpath:/myprops.properties" 
        p:placeholderPrefix="myprefix-"/>

<bean class="com.mycompany.MyClass" p:myprop="${myprefix-value.from.myprops}"/>
 

3voto

user1071914 Points 889

Vous ne pouvez pas le faire directement, et ce JIRA problème de Printemps explique pourquoi (vérifier le commentaire de Chris Poutres pour une explication détaillée):

https://jira.springsource.org/browse/SPR-6428

Cependant, il fournit une solution de contournement à l'aide de Printemps 3.1 ou version ultérieure, qui consiste à utiliser le PropertySourcesPlaceholderConfigurer classe au lieu de PropertyPlaceholderConfigurer classe.

Vous pouvez télécharger une Maven projet qui illustre le problème et la solution à partir du framework Spring questions github:

https://github.com/SpringSource/spring-framework-issues

Recherchez le numéro, SPR-6428, dans le téléchargé projets.

0voto

Vadzim Points 4460

Nous avons l'approche suivante qui fonctionne:

 <util:properties id="defaultProperties">
    <prop key="stand.name">DEV</prop>
    <prop key="host">localhost</prop>
</util:properties>
<context:property-placeholder 
    location="file:${app.properties.path:app.properties}" 
    properties-ref="defaultProperties"/>
 

La propriété système app.properties.path peut être utilisée pour remplacer le chemin d'accès au fichier de configuration.

Et l'application regroupe certaines valeurs par défaut pour les espaces réservés qui ne peuvent pas être définies avec des valeurs par défaut dans les modules communs.

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