внешняя конфигурация на основе контекстного пути - PullRequest
4 голосов
/ 19 ноября 2010

Я хотел бы развернуть несколько независимых копий определенного веб-приложения на одном сервере Tomcat под разными контекстными путями. Каждому веб-приложению потребуются разные параметры конфигурации (имя базы данных, пароль и т. Д.), Но я бы хотел, чтобы войны были абсолютно идентичными.

Мой план состоял в том, чтобы приложение вычисляло свой контекстный путь при запуске, а затем читало определенный файл .properties вне tomcat, идентифицированный контекстным путем. Например, если война была развернута в {tomcat path} / webapps / pineapple, то я бы хотел прочитать /config/pineapple.properties

Я пытался найти способ внедрить экземпляр ServletContext через spring (3), но все советы, которые я видел до сих пор, используют устаревший ServletContextFactoryBean.

Есть ли лучший способ вставить путь контекста или лучший способ загрузки внешних файлов на основе пути контекста?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2011

С помощью ServletContextAttributeFactoryBean и Spring EL вы можете ссылаться на параметры инициализации ServletContext (<context-param> в web.xml) следующим образом:

#{contextAttributes.myKey}

Это позволяет вам использовать PropertyPlaceHolderConfigurer изагрузить файлы свойств из произвольных, определенных пользователем местоположений:

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

Соответствующее определение параметра инициализации ServletContext в файле Tomcat context.xml:

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

Или в файле web.xml вашего приложения:

<context-param>
    <param-name>APP_HOME</param-name>
    <param-value>file:/test</param-value>
</context-param> 
4 голосов
/ 26 июля 2012

Это должно быть решением.

<bean name="envConfig" class="EnvironmentConfiguration">
     <property name="locations">
    <list>
        <value>file:///#{servletContext.contextPath}.properties</value>
    </list>
     </property>
     <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
1 голос
/ 19 ноября 2010
  1. Расширить Propertyplaceholderconfigurer, чтобы использовать DB для сбора значений. Пример здесь
  2. Загрузить фактические значения настроек (имя базы данных, пароль и т. Д.) В базу данных как часть начальных данных
  3. Когда инициализируется ctx приложения вашего веб-приложения, свойства разрешаются из БД

Это подход, которому мы следовали и который прекрасно работает. Если вы можете переключиться на Spring 3.1, он поддерживает Environment Profiles , который может быть вам полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...