【问题标题】:external config based on context path基于上下文路径的外部配置
【发布时间】:2011-05-12 10:34:35
【问题描述】:

我想在不同上下文路径下的同一 tomcat 服务器上部署特定 web 应用程序的多个独立副本。每个网络应用都需要不同的配置设置(数据库名称、密码等),但我希望保持战争完全相同。

我的计划是让应用程序在启动时确定其上下文路径,然后读取上下文路径标识的 tomcat 之外的特定 .properties 文件。例如,如果将战争部署到 {tomcat path}/webapps/pineapple,那么我想读取 /config/pineapple.properties

我一直在尝试找到一种通过 spring (3) 注入 ServletContext 实例的方法,但到目前为止我看到的所有建议都使用了已弃用的 ServletContextFactoryBean。

有没有更好的方法来注入上下文路径或更好的方法来根据上下文路径加载外部文件?

【问题讨论】:

  • 请问你为什么要这样做?
  • 我有一个由多个用户独立使用的应用程序。该应用程序在所有用户中都是相同的,唯一的区别是数据库连接细节。我只想构建一个知道如何根据 servlet 上下文路径(或其他一些外部元数据)找到正确配置的战争

标签: spring tomcat


【解决方案1】:

这应该是解决方案。

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

【讨论】:

    【解决方案2】:

    ServletContextAttributeFactoryBean和Spring EL的帮助下,你可以像这样引用ServletContext初始化参数(web.xml中的&lt;context-param&gt;):

    #{contextAttributes.myKey}
    

    这允许您使用PropertyPlaceHolderConfigurer 并从用户定义的任意位置加载属性文件:

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

    Tomcat的context.xml中ServletContext init参数的对应定义:

    <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> 
    

    【讨论】:

    • 正在寻找这样的东西。谢谢!
    【解决方案3】:
    1. 扩展 Propertyplaceholderconfigurer 以使用 DB 获取值。示例here
    2. 将设置的实际值(数据库名称、密码等)作为种子数据的一部分加载到数据库中
    3. 当您的网络应用的应用 ctx 正在初始化时,属性会从数据库中解析

    这是我们一直遵循的方法,效果很好。如果您可以切换到 Spring 3.1,那么它支持 Environment Profiles,这可能对您有用。

    【讨论】:

    • 我看不到这里是如何引用 servlet 上下文路径的。为了让两个相同的战争基于 servlet 上下文路径加载不同的配置文件/设置,在我看来,必须有一些东西可以读取 servlet 上下文路径,我在那个例子中没有看到。也许我错过了什么?
    • 我找到了一些相关的东西 - ServletContextPropertyPlaceholderConfigurer。似乎它应该是了解 servlet 上下文路径的东西......但我没有任何运气
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2011-10-22
    • 2016-08-23
    • 2017-02-16
    • 2015-06-19
    • 2013-03-11
    • 2012-03-15
    相关资源
    最近更新 更多