Spring Spring PropertyPlaceholderConfigurer可以忽略属性位置路径中的未设置属性吗?

时间:2015-01-09 12:54:03

标签: java spring tomcat configuration environments

我有一个在tomcat容器中运行的基于Spring的Web应用程序,我想维护两个不同的配置文件:

  • src / main / resources / default.properties :包含开发,集成测试以及未设置其他属性时的默认值
  • ... / tomcat / conf / app.properties:在不同的环境中有不同的内容,应该覆盖default.properties

当应用程序在tomcat中运行时,我有一个正常工作的弹簧配置

APP-context.xml中

<context:property-placeholder
    ignore-resource-not-found="true"
    ignore-unresolvable="true"
    system-properties-mode="OVERRIDE"
    location="classpath:default.properties,
              file:${catalina.home}/conf/app.properties"/>

但是当我尝试在集成测试中使用此配置时,在tomcat容器之外,加载applicationContext失败:

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:308)
    ...
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0' defined in null: Could not resolve placeholder 'catalina.home'
    at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:287)

有没有办法告诉Spring忽略位置文件:$ {catalina.home} /conf/app.properties什么时候catalina.home属性没有在当前上下文中设置?

3 个答案:

答案 0 :(得分:0)

您可以设置ignore-resource-not-found来解决此问题。

试试这个:

<context:property-placeholder
    ignore-resource-not-found="true"
    ignore-unresolvable="true"
    system-properties-mode="OVERRIDE"
    location="classpath:default.properties,
              file:${catalina.home}/conf/app.properties"/>

spring-context.xsd的代码片段:

<xsd:attribute name="ignore-resource-not-found" type="xsd:boolean" default="false">
            <xsd:annotation>
                <xsd:documentation><![CDATA[
    Specifies if failure to find the property resource location should be ignored.
    Default is "false", meaning that if there is no file in the location specified
    an exception will be raised at runtime.
                ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>

答案 1 :(得分:0)

由于您有一个上下文,某些PP值可能未解析,您可以尝试使用default variant作为属性:

file:${catalina.home:}/conf/app.properties

在这种情况下,如果没有catalina.home属性,则将路径前缀解析为空字符串,例如在System.getProperties()中,我想是Tomcat的情况。

之后ignore-resource-not-found="true"完成了这些工作。

答案 2 :(得分:0)

我建议使用弹簧配置文件来启用/禁用属性文件。

在tomcat上运行tomcat时,在tomcat&#34;或&#34; web&#34;配置文件并将app.properties加载到该配置文件中。