Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring-如何在不枚举所有必需属性的情况下获取属性文件的子集_Java_Spring_Hikaricp_Spring Properties - Fatal编程技术网

Java Spring-如何在不枚举所有必需属性的情况下获取属性文件的子集

Java Spring-如何在不枚举所有必需属性的情况下获取属性文件的子集,java,spring,hikaricp,spring-properties,Java,Spring,Hikaricp,Spring Properties,我正在加载我的属性文件,如下所示: @Configuration @PropertySource("classpath:app.properties") class MyApp { @Bean public PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer();

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

@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的值。在我的例子中,我在生成Tomcat容器时定义了环境变量db port

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

我希望避免在代码中枚举/硬编码所有可能的数据库相关属性。幸运的是,使用中的数据库层Hikari有一个很好的特性,我可以通过java.util.properties传递所有属性。所以,我希望检索数据库*下所有定义的属性,并将其转发给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;
    }
}
而不是

jdbc:postgresql://localhost:9876/mydb
因此,出于某种原因,${db port:5432}尚未解析?当通过此路线时,可配置环境

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

请注意,在默认场景中,property database.dataSource.url=jdbc:p中的${db port:5432}ostgresql://localhost:${db port:5432}/mydb已正确解析。我通过定义以下成员并将其记录下来来对此进行测试:

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

您应该仅从真实环境中读取属性值。然后,只有您才能获得财产的实际或有效价值

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

更改此行:

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

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

太好了,这个修好了!我已经有了环境ConfigurableEnvironment,所以我刚刚调用了environment.getPropertyk,它就可以工作了!还是应该有充分的理由单独注入环境而不是ConfigurableEnvironment?ConfigurableEnvironment扩展了环境。因此,最好只注射一次。谢谢你这么说。我会相应地更新答案。太好了!谢谢。
p.put(k.substring(key.length()), environment.getProperty(k));