Spring中用于读取属性文件的不同行为

时间:2013-08-27 17:02:01

标签: java spring spring-mvc properties classpath

我能够使用以下配置在我的spring应用程序中读取属性文件(注意类路径中的通配符

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
    <value>classpath*:*/**/test*.properties</value>
</property>

但是,当我使用相同的通配符模式使用org.springframework.web.util.Log4jConfigListener中的web.xml指定自定义Log4j属性文件时,如下所示,它会因令人讨厌的FileNotFoundException而失败,并且Log4j未初始化。

有人可以帮我解决问题并指出我在这里错过了什么。

的web.xml

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath*:*/**/customLog4j*.properties</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

P.S。:我知道财产占有者即。 ${SOME_PLACE_HOLDER}我们可以将占位符值替换为各自的系统/环境属性),这在我的情况下无法应用,因为我们无法控制设置此类系统/环境属性和必须使用通配符来解析自定义log4j属性的路径。

2 个答案:

答案 0 :(得分:1)

Log4ConfigListener使用Log4jWebConfigurer使用ResourceUtils从您指定的路径加载URL

public static URL getURL(String resourceLocation) throws FileNotFoundException {
    ... // trying with prefix 'classpath:' which you don't have
    try {
        // try URL
        return new URL(resourceLocation); // this will throw malformed
    }
    catch (MalformedURLException ex) {
        // no URL -> treat as file path
        try {
            return new File(resourceLocation).toURI().toURL();
        }
        catch (MalformedURLException ex2) {
            throw new FileNotFoundException("Resource location [" + resourceLocation +
                    "] is neither a URL not a well-formed file path");
        }
    }
}

所以你得到FileNotFoundExceptionLog4jWebConfigurer PropertyPlaceholderConfigurer解释了它可以采取的路径。我认为它不适用于通配符。

解释为什么classpath*:*/**/test*.properties可以读取它:XML bean解析器读取locations属性中的值ClassPathResource并生成{{1}}的一些实现,并将其传递给实际的豆子。通配符行为包含在那里。

答案 1 :(得分:0)

为他人的利益发布解决方案。

PathMatchingResourcePatternResolvergetResources方法解析通配符类路径并返回找到的所有匹配项Resource

然后可以相应地使用Resource对象。