16

Web アプリケーションで Spring 3.2 を使用してい.propertiesますが、クラスパス内にデフォルト値を含むファイルが必要です。.propertiesユーザーは、JNDI を使用して、デフォルト値をオーバーライドする別のファイルが格納される場所を定義できる必要があります。

configLocation以下は、ユーザーがas JNDI プロパティを設定している限り機能します。

@Configuration
@PropertySource({ "classpath:default.properties", "file:${java:comp/env/configLocation}/override.properties" })
public class AppConfig
{
}

ただし、外部オーバーライドはオプションである必要があり、JNDI プロパティもオプションである必要があります。

現在、例外が発生します ( java.io.FileNotFoundException: comp\env\configLocation\app.properties (The system cannot find the path specified)JNDI プロパティが見つからない場合。

JNDI プロパティ ( ) が設定さ.propertiesれている場合にのみ使用されるオプションを定義するにはどうすればよいですか? configLocationこれは可能ですか、@PropertySourceそれとも別の解決策がありますか?

4

3 に答える 3

47

Spring 4 の時点で、問題SPR-8371が解決されました。その結果、@PropertySource注釈には、ignoreResourceNotFoundまさにこの目的のために追加された という新しい属性があります。さらに、次のような実装を可能にする新しい@PropertySourcesアノテーションもあります。

@PropertySources({
    @PropertySource("classpath:default.properties"),
    @PropertySource(value = "file:/path_to_file/optional_override.properties", ignoreResourceNotFound = true)
})
于 2014-01-10T13:24:41.630 に答える
5

まだ Spring 4 を使用していない場合 (matsev のソリューションを参照)、より詳細ですが、ほぼ同等のソリューションを次に示します。

@Configuration
@PropertySource("classpath:default.properties")
public class AppConfig {

    @Autowired
    public void addOptionalProperties(StandardEnvironment environment) {
        try {
            String localPropertiesPath = environment.resolvePlaceholders("file:${java:comp/env/configLocation}/override.properties");
            ResourcePropertySource localPropertySource = new ResourcePropertySource(localPropertiesPath);
            environment.getPropertySources().addLast(localPropertySource);
        } catch (IOException ignored) {}
    }

}
于 2014-05-27T11:02:36.473 に答える