使用PropertyPlaceholder时,在Spring webapp中忽略了Tomcat Context-Params

时间:2013-07-05 15:33:15

标签: spring

我以前使用过现在已弃用的类org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer来从服务器的文件系统加载属性文件。我确定了以下bean:

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="locations" value="${config}"/>
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="searchContextAttributes" value="true"/>
    <property name="contextOverride" value="false"/>
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="searchSystemEnvironment" value="false"/>
</bean>

config是启动Tomcat时传递的参数,即

-Dconfig=/path/to/application.properties

对于webapp,我也有一个上下文文件:

<Context docBase="/path/to/application.war">
    <Parameter name="host" value="localhost" override="false"/>
    <Parameter name="port" value="8080" override="false"/>
</Context>

如果.properties参数指定的-Dconfig文件包含其他一些bean引用的属性,则使用.properties文件中的值,否则来自的值{使用了上下文xml文件。

这允许我使用WAR部署一组默认属性,如果需要,我可以指定.properties文件来覆盖特定值。

现在,我正在更新以在Spring 3.1中使用新的属性抽象,但我似乎无法弄清楚它的等效方法是什么?

我以相同的方式部署了相同的上下文文件和war,现在我在应用程序中有以下内容:

<context:property-placeholder
        location="${config}"
        system-properties-mode="OVERRIDE"
        ignore-resource-not-found="true"
        ignore-unresolvable="true"/>

它查找并使用属性文件中的属性,但它不使用上下文XML文件中的值。

在使用这个新的属性占位符时,如何让我的应用程序使用上下文参数?

感谢。

2 个答案:

答案 0 :(得分:4)

总结问题的是,在使用Spring 3.1中引入的新Property Propertyholder命名空间时,servlet上下文文件中的Context Parameters未用于解析占位符。

我找到了一个解决方案,其中包含以下内容

<context:property-placeholder location="${config}" local-override="true" ignore-resource-not-found="true"/>

我可以使用JVM arg在本地文件系统上指定一个或多个* .properties文件,例如:

-Dconfig=/path/app.properties

如果在检查app.properties文件后无法解析占位符属性,则会检查Servlet上下文参数。

这允许我在web.xml中使用上下文参数来获取默认值,我需要通过使用config JVM arg指定* .properties文件的位置来覆盖这些值。

让它以这种方式工作的关键是包含local-override="true",默认情况下为false。我不完全确定它有意义,因为该属性的描述是:

  

指定本地属性是否覆盖文件的属性。默认       是“false”:文件中的属性覆盖本地默认值。

如果app.properties中存在相同的属性键,则使用web.xml app.properties中的值{/ p>

答案 1 :(得分:1)

除非定义了基于用户的属性文件,否则Spring会使用默认属性文件。如果要控制.properties文件,请按照here发布的说明进行操作。

如果您想利用application.properties,有两种方法可以做到这一点。

<!-- allows for ${} replacement in the spring xml configuration from the 
    system.properties file on the classpath -->
<util:properties id="appProperties" location="classpath:application.properties"/>
<context:property-placeholder location="classpath:application.properties"/>

util标签允许您使用Property类来读取整个应用程序的属性。例如:

@Autowired
public MyPropertyReader(Properties appProperties) {
    String prop1 =  appProperties.getProperty("my.address");
    String prop2 =  appProperties.getProperty("my.version");
}

如果要使用上下文文件中的值,请使用context:property-placeholder标记。然后您可以将您的值用作

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" p:brokerURL="${jms.primary.server}"/>

其中例如app.properties中的jms.primary.server = 172.168.10.18:6161。