0

以下の構成を使用して、Spring アプリケーションでプロパティ ファイルを読み取ることができます (クラスパスのワイルドカードに注意してください) 。

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

しかし、同じワイルドカード パターンを使用して、以下のようにorg.springframework.web.util.Log4jConfigListenerinを使用してカスタム Log4j プロパティ ファイルを指定すると、厄介で失敗し、Log4j が初期化されません。web.xmlFileNotFoundException

誰かが問題を解決するのを手伝ってくれて、ここで何が欠けているのかを教えてくれますか?

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>

PS:私は、プロパティ プレース ホルダー、つまりを認識しています。${SOME_PLACE_HOLDER}プレースホルダーの値をそれぞれのシステム/環境プロパティに置き換えることができます)このようなシステム/環境プロパティの設定を制御できず、ワイルドカードを使用してカスタムlog4jプロパティへのパスを解決する必要があるため、私の場合は適用できません.

4

2 に答える 2

1

指定したパスからロードするために使用Log4ConfigListenerするLog4jWebConfigurerResourceUtilsURL

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。のjavadocLog4jWebConfigurerは、どのようなパスを取ることができるかを例で説明しています。ワイルドカードでは機能しないと思います。

なぜPropertyPlaceholderConfigurerそれを読み取ることができるのかを説明すると、XML Bean パーサーclasspath*:*/**/test*.propertiesはプロパティの値を読み取り、実際の Bean に渡すlocations何らかの実装を生成します。ClassPathResourceワイルドカードの動作はそこに含まれています。

于 2013-08-27T17:20:41.920 に答える
0

他人の利益のための投稿ソリューション。

PathMatchingResourcePatternResolvergetResourcesメソッドは、ワイルドカード クラスパスを解決し、見つかったすべての一致をResourceの配列として返します

その後、Resourceオブジェクトはそれに応じて使用できます。

于 2013-08-28T10:16:36.367 に答える