可选@PropertySource位置

2022-09-02 22:58:41

我在Web应用程序中使用Spring 3.2,我想在类路径中有一个包含默认值的文件。用户应该能够使用 JNDI 来定义存储另一个位置的位置,该位置将覆盖缺省值。.properties.properties

只要用户设置了 as JNDI 属性,以下操作就有效。configLocation

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

但是,外部覆盖应该是可选的,JNDI 属性也应该是可选的。

目前我得到一个异常(当JNDI属性丢失时。java.io.FileNotFoundException: comp\env\configLocation\app.properties (The system cannot find the path specified)

如何定义仅在设置 JNDI 属性 () 时使用的可选选项?这甚至有可能吗,或者有其他解决方案吗?.propertiesconfigLocation@PropertySource


答案 1

自春季 4 日起,问题 SPR-8371 已得到解决。因此,注释具有一个名为的新属性,该属性正是为此目的而添加的。此外,还有新的@PropertySources注释,它允许实现如下:@PropertySourceignoreResourceNotFound

@PropertySources({
    @PropertySource("classpath:default.properties"),
    @PropertySource(value = "file:/path_to_file/optional_override.properties", ignoreResourceNotFound = true)
})

答案 2

如果你还没有使用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) {}
    }

}

推荐