2010-11-19 5 views
4

Je souhaite déployer plusieurs copies indépendantes d'une application Web particulière sur le même serveur Tomcat sous différents chemins de contexte. Chaque application web aura besoin de différents paramètres de configuration (nom de la base de données, mot de passe, etc), mais je voudrais garder les guerres exactement identiques.config externe basé sur le chemin de contexte

Mon plan était que l'application détermine son chemin de contexte au démarrage, puis lisait un fichier .properties spécifique en dehors de tomcat identifié par le chemin du contexte. Par exemple, si une guerre a été déployée sur {tomcat path}/webapps/ananas, alors je voudrais lire /config/pineapple.properties

J'ai essayé de trouver un moyen d'injecter une instance de ServletContext via spring (3), mais tous les conseils que j'ai pu voir jusqu'ici utilisent l'obsolète ServletContextFactoryBean.

Y a-t-il un meilleur moyen d'obtenir le chemin du contexte injecté ou une meilleure façon de charger les fichiers externes en fonction du chemin du contexte? Étendre Propertyplaceholderconfigurer pour utiliser DB pour récupérer les valeurs.

+0

puis-je vous demander pourquoi vous voulez faire cela? – shsteimer

+0

J'ai une application qui est utilisée par plusieurs utilisateurs, indépendamment l'un de l'autre. l'application est identique pour tous les utilisateurs, la seule différence étant les spécificités de la connexion à la base de données. je voudrais seulement construire une guerre qui sache trouver la bonne config basée sur le chemin de contexte de servlet (ou d'autres méta-données externes) – Keith

Répondre

1
  1. Exemple here
  2. charge les valeurs réelles des paramètres (nom de base de données, mot de passe, etc.) à la db dans le cadre des données de semences
  3. Lorsque votre application de Web App CTX est en cours d'initialisation, les propriétés sont résolus de la DB

C'est l'approche que nous suivons et fonctionne très bien. Si vous pouvez passer à Spring 3.1, il prend en charge Environment Profiles ce qui peut vous être utile.

+0

Je ne vois pas comment le chemin de contexte de servlet est référencé ici. Afin que deux guerres identiques puissent charger des fichiers/paramètres de configuration distincts basés sur le chemin de contexte de servlet, il me semble qu'il doit y avoir quelque chose qui lit le chemin de contexte de servlet, que je ne vois pas dans cet exemple. Peut-être qu'il me manque quelque chose? – Keith

+0

J'ai trouvé quelque chose en rapport - ServletContextPropertyPlaceholderConfigurer. On dirait que ça devrait être quelque chose qui connaîtrait le chemin du contexte de servlet ... mais je n'ai pas de chance – Keith

4

Avec l'aide de ServletContextAttributeFactoryBean et Spring EL, vous pouvez référencer les paramètres de ServletContext (<context-param> dans web.xml) comme ça:

#{contextAttributes.myKey} 

Cela vous permet d'utiliser PropertyPlaceHolderConfigurer et les fichiers propriété de charge à partir, l'utilisateur arbitraire endroits -defined:

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="#{contextParameters.APP_HOME}/conf/app.properties"/> 
</bean> 

la définition correspondante du paramètre init ServletContext dans context.xml de Tomcat:

<Parameter name="APP_HOME" value="file:/test" override="false"/> 

Ou dans web.xml de votre application:

<context-param> 
    <param-name>APP_HOME</param-name> 
    <param-value>file:/test</param-value> 
</context-param> 
+0

Je cherchais quelque chose comme ça. Je vous remercie! –

4

Cela devrait être la solution.

<bean name="envConfig" class="EnvironmentConfiguration"> 
    <property name="locations"> 
    <list> 
     <value>file:///#{servletContext.contextPath}.properties</value> 
    </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders" value="true" /> 
</bean> 
Questions connexes