【问题标题】:Different behavior in Spring for reading property fileSpring中读取属性文件的不同行为
【发布时间】:2013-08-30 13:22:00
【问题描述】:

我可以使用以下配置在我的 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.:我知道财产占位符,即。 ${SOME_PLACE_HOLDER}我们可以用相应的系统/环境属性替换占位符值)在我的情况下无法应用,因为我们无法控制设置此类系统/环境属性并且必须使用通配符解析自定义 log4j 属性的路径。

【问题讨论】:

  • 不这么认为 - org.springframework.web.util.Log4jConfigListener 是使用 log4jConfigLocation 的 spring 框架的一部分,与任何特定的 Servlet 容器无关
  • Log4jConfigListener 使用 Log4jWebConfigurer 加载配置。查看文档,了解什么是有效的以及如何配置 link
  • @madhav-turangi thnx 很有帮助:)

标签: java spring spring-mvc properties classpath


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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 for Log4jWebConfigurer 用示例解释了它可以采用的路径。我认为它不适用于通配符。

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

    【讨论】:

    • 你能分享一些详细解释XML bean解析器实现的链接/资源吗?可以将它用于我的自定义Log4ConfigListener 以支持通配符:)
    • @JavaBond 有一个完整的堆栈。您可以通过调试ClassPathXmlApplicationContext 构造函数自己尝试。否则请查看 ClassPathResource 类及其实现。
    • 已经探索过ClassPathResource 和一些AbstractResource。似乎还没有一个可以使用通配符:(
    • 我建议调试PropertiesLoaderUtils.fillProperties()。我相信这就是魔法发生的地方。看看fileName 变量包含什么。
    猜你喜欢
    • 2022-09-27
    • 2013-05-26
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多