0

我正在加载我的属性文件,如下所示:

@Configuration
@PropertySource("classpath:app.properties")
class MyApp {
    @Bean
    public PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

在属性文件中,我有几个与数据库相关的属性:

database.dataSource.url=jdbc:postgresql://localhost:${db-port:5432}/mydb
database.dataSource.x=...
database.dataSource.y=...
database.dataSource.z=...

笔记:

  • ${db-port}应替换为属性/环境变量的值db-port或 5432。在我的情况下,我在db-port生成 Tomcat 容器时定义环境变量。

  • 所有与数据库相关的属性都分组在database.根目录下。这是故意的,见下文。

我想避免我必须在我的代码中枚举/硬编码所有可能的与数据库相关的属性。幸运的是,正在使用的数据库层(Hikari)有一个很好的特性,我可以通过java.util.Properties. 所以,我想检索下所有定义的属性,database.*然后简单地将其转发给 Hikari。

为此,我编写了以下实用程序:

@Component
public class PropertyFetcher
{
    @Autowired
    private ConfigurableEnvironment environment;

    public Properties get(final String key) {
        final Properties p = new Properties();

        for (final PropertySource<?> s : environment.getPropertySources()) {
            if (s instanceof EnumerablePropertySource) {
                for (final String k : ((EnumerablePropertySource) s).getPropertyNames()) {
                    if (k.startsWith(key) && k.length() > key.length()) {
                        p.put(k.substring(key.length()), s.getProperty(k));
                    }
                }
            }
        }
        return p;
    }
}

现在,当调用 时get("database."),我拥有属性文件中定义的所有与数据库相关的属性。伟大的!但是,dataSource.url现在房产的价值是

jdbc:postgresql://localhost:${db-port:5432}/mydb

代替

jdbc:postgresql://localhost:9876/mydb

因此,由于某种原因,${db-port:5432}通过这条路线 ( ) 时未解决 (还没有?ConfigurableEnvironment)。

如何解决这个问题?或者有没有更好的方法来获取某个根下的所有属性,而不必将它们枚举/硬编码到代码中?

请注意,在默认情况下,正确解析了${db-port:5432}in 属性。database.dataSource.url=jdbc:postgresql://localhost:${db-port:5432}/mydb我通过定义以下成员并记录它来测试它:

@Value("${database.dataSource.url}")
final String url; // holds jdbc:postgresql://localhost:9876/mydb
4

1 回答 1

1

您应该只从真实环境中读取属性值。那么只有您将获得财产的实际或有效价值。

这将需要对您的代码进行一些更改。

改变这一行:

p.put(k.substring(key.length()), s.getProperty(k));

对此:

p.put(k.substring(key.length()), environment.getProperty(k));
于 2017-10-25T09:56:01.437 回答