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

Can Spring PropertyPlaceholderConfigurer ignore unset properties in a property location path?

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

我有一个 spring 配置,当应用程序在 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)

当 属性 catalina.home 是未在当前上下文中设置?

你可以设置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>

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

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

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

然后 ignore-resource-not-found="true" 完成任务。

我建议将 spring 配置文件用于 enable/disable 属性 个文件。

当 tomcat 中的 运行 切换 "tomcat" 或 "web" 配置文件并将 app.properties 加载到该配置文件中时。