我能够使用以下配置在我的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属性的路径。
答案 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");
}
}
}
所以你得到FileNotFoundException
。 Log4jWebConfigurer
PropertyPlaceholderConfigurer
解释了它可以采取的路径。我认为它不适用于通配符。
解释为什么classpath*:*/**/test*.properties
可以读取它:XML bean解析器读取locations
属性中的值ClassPathResource
并生成{{1}}的一些实现,并将其传递给实际的豆子。通配符行为包含在那里。
答案 1 :(得分:0)
为他人的利益发布解决方案。
PathMatchingResourcePatternResolver的getResources
方法解析通配符类路径并返回找到的所有匹配项Resource
然后可以相应地使用Resource
对象。