101 votes

Utilisation de plusieurs fichiers de propriétés (via PropertyPlaceholderConfigurer) dans plusieurs projets / modules

Nous sommes actuellement en train d'écrire une application qui est divisée en plusieurs projets/modules. Par exemple, prenons les modules suivants:

  • myApp-DAO
  • myApp-jabber

Chaque module dispose de son propre Printemps contexte fichier xml. Pour le DAO module j'ai un PropertyPlaceholderConfigurer qui lit un fichier de propriété avec la bd, les paramètres de connexion. Dans le jabber module j'ai aussi un PropertyPlaceHolderConfigurer pour la jabber propriétés de la connexion.

Vient maintenant l'application principale qui comprend myApp-DAO et myApp-jabber. Il lit tous les le contexte fichiers et commence un gros Ressort du contexte. Malheureusement, il semble comme il peut seulement être un PropertyPlaceholderConfigurer par le contexte, donc, n'importe quel module est chargé première est en mesure de le lire c'est les paramètres de connexion. L'autre déclenche une exception avec une erreur du type "impossible de résoudre espace réservé 'jabber.accueil""

Je sorte de comprendre ce qu'est le problème, mais je ne sais pas vraiment une solution, ou la meilleure pratique pour mon cas d'utilisation.

Comment puis-je configurer chaque module, de sorte que chacun est capable de charger son propre fichier de propriété? Droit maintenant, j'ai déménagé le PropertyPlaceHolderConfigurer de les séparer contexte fichiers et de les fusionner dans l'application principale du contexte (le chargement de tous les fichiers de propriétés avec un seul PropertyPlaceHolderConfigurer). Ce suce bien, parce que maintenant tout le monde qui utilise le module dao a savoir, qu'ils ont besoin d'un PropertyPlaceHolderConfigurer dans leur contexte .. les tests d'intégration dans le dao module échec etc.

Je suis curieux d'entendre sur les solutions/idées de la stackoverflow de la communauté..

179voto

Tim Hennekey Points 960

Si vous vous assurez que tous les utilisateurs réservés, dans chacun des contextes concernés, ignorent les clés impossibles à résoudre, ces deux approches fonctionnent. Par exemple:

 <context:property-placeholder
location="classpath:dao.properties,
          classpath:services.properties,
          classpath:user.properties"
ignore-unresolvable="true"/>
 

ou

     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:dao.properties</value>
                <value>classpath:services.properties</value>
                <value>classpath:user.properties</value>
            </list>
        </property> 
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
    </bean>
 

18voto

Raul Rene Points 3660

Je sais que c'est une vieille question, mais la propriété ignore-unresolvable ne fonctionnait pas pour moi et je ne savais pas pourquoi.

Le problème était que j'avais besoin d'une ressource externe (quelque chose comme location="file:${CATALINA_HOME}/conf/db-override.properties" ) et le ignore-unresolvable="true" ne fait pas le travail dans ce cas.

Pour ignorer une ressource externe manquante, il faut:

 ignore-resource-not-found="true"
 

Juste au cas où quelqu'un d'autre se cogne dessus.

8voto

James Points 5907

Vous pouvez avoir plusieurs éléments <context:property-placeholder /> au lieu de déclarer explicitement plusieurs beans PropertiesPlaceholderConfigurer.

4voto

Stephen C Points 255558

Le bean PropertiesPlaceholderConfigurer a une propriété alternative appelée "propertiesArray". Utilisez cette propriété à la place de la propriété "properties" et configurez-la avec <array> de références de propriété.

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