gpt4 book ai didi

java - Spring 中读取属性文件的不同行为

转载 作者:行者123 更新时间:2023-12-01 14:11:51 26 4
gpt4 key购买 nike

我可以使用以下配置读取 Spring 应用程序中的属性文件(注意类路径中的通配符)

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

但是,当我使用相同的通配符模式使用 web.xml 中的 org.springframework.web.util.Log4jConfigListener 指定自定义 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.:我知道属性(property)占位符,即。 ${SOME_PLACE_HOLDER} (我们可以用相应的系统/环境属性替换占位符值),这不适用于我的情况,因为我们无法控制设置此类系统/环境属性,并且必须使用通配符来解析自定义 log4j 属性的路径。

最佳答案

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");
}
}
}

所以你会得到一个FileNotFoundExceptionjavadoc Log4jWebConfigurer 通过示例解释了它可以采用的路径。我认为它不适用于通配符。

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

关于java - Spring 中读取属性文件的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com