【问题标题】:External properties loader with Tomcat server带有 Tomcat 服务器的外部属性加载器
【发布时间】:2012-01-30 21:36:27
【问题描述】:

我正在尝试将 spring mvc webapp 部署到 tomcat 服务器中。我一直在使用 maven-jetty-plugin 进行本地测试。在我的 spring 配置中,我使用属性占位符,并从外部文件中提取我的属性:

<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true"/>
<bean id="modelPropertyPlaceholder" class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="searchContextAttributes" value="true"/>
    <property name="contextOverride" value="true"/>
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="locations">
        <list>
            <value>classpath:default.model.properties</value>
            <value>file:/etc/app/app.properties</value>
            <value>${config}</value>
        </list>
    </property>
</bean>

这适用于我的码头插件...但是当我将 WAR 文件部署到 tomcat 服务器时,我收到以下错误:

 org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

在我的外部属性文件中,我定义了驱动程序类和连接 url。像这样:

jndi.jpa.rms.datasource=jdbc/testDS
rms.db.driver=com.mysql.jdbc.Driver
rms.db.url=jdbc:mysql://testdatabaseurl:3306/test
rms.db.user=sa
rms.db.password=asfdas
rms.db.checkconnsql=select 1
rms.hibernate.generateddl=false
rms.hibernate.showsql=true
rms.hibernate.dbdialect=org.hibernate.dialect.MySQLDialect

更新:

似乎tomcat确实拾取了外部属性文件:

 14:23:09.803 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'modelPropertyPlaceholder'
 14:23:09.810 [main] INFO  o.s.w.c.s.ServletContextPropertyPlaceholderConfigurer - Loading properties file from class path resource [default.model.properties]
 14:23:09.810 [main] INFO  o.s.w.c.s.ServletContextPropertyPlaceholderConfigurer - Loading properties file from URL [file:/etc/app/app.properties]
 14:23:09.810 [main] INFO  o.s.w.c.s.ServletContextPropertyPlaceholderConfigurer - Loading properties file from ServletContext resource [/${config}]
 14:23:09.811 [main] WARN  o.s.w.c.s.ServletContextPropertyPlaceholderConfigurer - Could not load properties from ServletContext resource [/${config}]: Could not open ServletContext resource [/${config}]

我不确定为什么 tomcat 没有获取连接 url 和驱动程序。 这是一个tomcat问题还是我错过了什么?谢谢

【问题讨论】:

    标签: spring-mvc tomcat5.5


    【解决方案1】:

    这不是Tomcat的问题,你一定是犯了一些小错误,没有加载属性。

    1. 属性文件是否位于 Tomcat 环境中的正确位置?
    2. 您确定在这些属性文件中没有将某些键留空吗?

    如果该问题的两个答案都是正确的,请尝试使用以下内容更改您的配置:

    &lt;context:property-placeholder location="ADD_PATH_TO_YOUR_FILES SEPARATED_WITH_SPACES"/&gt;

    我猜您在这里混合了两个属性占位符,一个是“常规”,另一个是绑定到 servlet 上下文。我敢打赌,它们会以某种方式重叠,其中一个会被默默地忽略。

    我会坚持property-placeholder

    【讨论】:

    • 属性文件根本不在tomcat环境中。它们在同一台机器上,但位于不同的目录中。我想从 tomcat 实例中提取属性(配置)。我很确定我拥有所有的键,正如我所说的我的 default.properties(包含在类路径中,具有相同的配置选项,除了它在内存 db 与 mysql 中使用 hypersql)
    • 好的,但你为什么决定使用ServletContextPropertyPlaceholderConfigurer?我认为属性占位符就足够了。
    【解决方案2】:

    老问题,但是...

    从日志输出来看,Spring 似乎没有解析您的 ${config} 引用,否则这将被替换为最后一条日志消息中给出的路径:

    Could not load properties from ServletContext resource [/${config}]: Could not open ServletContext resource [/${config}]
    

    这是我刚刚遇到的一个案例,它正确解析了 ${catalina.home}/conf/myprops.properties 但无法加载引用的文件:

    Could not load properties from ServletContext resource [/D:/somepath/apache-tomcat/conf/myprops.properties]: Could not open ServletContext resource [/D:/somepath/apache-tomcat/conf/myprops.properties]
    

    我在我的案例中找到了错误 - 我需要在外部文件引用前面加上“文件:”。也就是说,它应该是 file:${catalina.home}/conf/myprops.properties

    (Spring 版本差异也可能对您的日志输出产生了影响,并且它确实解决了引用,但只是没有在输出中显示这一点。作为参考,我使用的是 Spring 4.1。目前有 6 个)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2012-03-21
      相关资源
      最近更新 更多