【问题标题】:finding a property using Spring and Webapp properties placeholder使用 Spring 和 Webapp 属性占位符查找属性
【发布时间】:2011-09-22 06:47:51
【问题描述】:

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

我正在构建一个战争文件并希望结构是:

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我想我是:))。

有什么建议吗?

【问题讨论】:

    标签: java spring web-applications properties war


    【解决方案1】:

    这应该可以工作

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

    WEB-INF 不是 web-app 的根目录,所以需要将 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>
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我认为spring文件的首选位置是WEB-INF/spring/。我不记得我在哪里读到的 - 但你在 web.xml 文件中设置了它。
      • 我认为该目录在您构建之前是“spring”,但是一旦生成了 WAR,它就会全部出现在“类”中,因此它最终会出现在类路径中。这可能不是您的愿望,但 WAR 结构已经标准化;你不应该尝试自定义它。
      • 我将不理会属性文件 :)。顺便说一句 - 弹簧文件不会复制到类文件夹中。看看宠物店link。它是由 Maven 构建的,它直接复制 WEB-INF,然后将 src/main/resources 复制到 WEB-INF/classes/ 并且属性通常位于 src/main/resources 中
      【解决方案3】:

      我不确定你想要实现什么。这是我用来将基本属性文件中的属性注入 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使用系统属性(这个行为可以改变)。

      【讨论】:

      • 我可以访问属性 - 这是我希望文件存在的地方。而不是在 WEB-INF/classes/properties/*.properties 我宁愿有 WEB-INF/properties/*.properties
      猜你喜欢
      • 2014-07-16
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      相关资源
      最近更新 更多