使用Spring和Webapp属性占位符查找属性

时间:2011-06-24 18:56:20

标签: java spring web-applications properties war

这是一个“简单”的问题,我正在寻找一个操作方法和/或一个愚蠢的不做的事情。我对两者持开放态度。

我正在构建一个war文件,并希望结构为:

WEB-INF/
  properties/
    <my properties files>
  classes/
    ...
  spring/
    <my spring files>
那是愚蠢的吗?我知道我可以通过属性占位符访问属性文件,但我不想在类部分中嵌套属性 - 这对我来说没有意义。

所以Spring文件看起来像这样:

<context:property-placeholder location="classpath:properties/*.properties" />

如果我想在课程区域中访问它们。我以为

<context:property-placeholder location="properties/*.properties" />

会让我直接把目录放在WEB-INF下......我错了(ps我想我是:))。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

这应该有效

<context:property-placeholder location="WEB-INF/properties/*.properties" />

WEB-INF不是网络应用程序的根目录,因此您需要将WEB-INF添加到路径中。

spring-context-3.1.xsd

<xsd:attribute name="location" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
<![CDATA[ 
    The location of the properties file to resolve placeholders against, as a Spring
    resource location: a URL, a "classpath:" pseudo URL, or a relative file path.
    Multiple locations may be specified, separated by commas. If neither location nor properties-ref is
    specified, placeholders will be resolved against system properties.


  ]]> 
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>

答案 1 :(得分:2)

你不能按照你想要的方式去做,因为Classloader的类路径是/ classes目录和/ lib目录中的任何jar。这是war文件的标准配置。

战争和耳朵具有特定的配置,您必须遵循这些配置才能使文件有效。如果您考虑一下,如果没有标准格式,那么让不同供应商提供可以部署相同war文件的Web容器变得困难。有pretty informative page here

要实现类似于你想要的东西,你可以简单地拥有/ classes / properties和/ classes / spring的目录,并从你的类路径中适当地查找它们(“classpath:properties / myfile.properties)。

答案 2 :(得分:0)

我不确定你想要达到什么目标。这里我使用的方法将属性从基本属性文件注入到bean:

在spring文件(XML bean定义)中,我添加了对我的属性文件(myfile.properties)的引用:

<bean id="propertyConfigurer"
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location" value="classpath:myfile.properties" />
</bean> 

然后我添加对属性的引用(db.url是我的数据库连接的URL地址,我只保留了我的属性文件中引用的bean属性。)

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <!-- results in a setDriverClassName(String) call -->
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url"><value>${db.url}</value></property>
    <property name="username"><value>${db.login}</value></property>
    <property name="password"><value>${db.password}</value></property>

</bean>

默认情况下,如果属性文件中未定义属性,则Spring使用“系统属性”(可以更改此行为)。