Spring PropertyPlaceholderConfigurer 可以忽略 属性 位置路径中未设置的属性吗?
Can Spring PropertyPlaceholderConfigurer ignore unset properties in a property location path?
我在 tomcat 容器中有一个基于 Spring 的 Web 应用程序 运行,我想维护两个不同的配置文件:
- src/main/resources/default.properties:包含开发、集成测试和未设置其他属性时的默认值
- .../tomcat/conf/app.properties: 在不同的环境中有不同的内容,应该覆盖 default.properties
我有一个 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 加载到该配置文件中时。
我在 tomcat 容器中有一个基于 Spring 的 Web 应用程序 运行,我想维护两个不同的配置文件:
- src/main/resources/default.properties:包含开发、集成测试和未设置其他属性时的默认值
- .../tomcat/conf/app.properties: 在不同的环境中有不同的内容,应该覆盖 default.properties
我有一个 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 加载到该配置文件中时。