如何在Java Sping Boot 应用程序中从application.properties文件中读取所有属性的名称及其值

cuxqih21  于 12个月前  发布在  Java
关注(0)|答案(2)|浏览(292)

我想在Java Sping Boot 应用程序中读取application.properties文件中的所有值及其键。
我可以通过article以多种方式读取值。这种方法的问题是每次添加属性时,我们都需要更新代码。
我想要一个动态的方式来读取所有的键和值。我不想在属性添加到application.properties文件后更改代码。
我尝试了这样的方法,但没有得到想要的结果:

@Autowired
    private Environment environment;

    @GetMapping
    public Map<String, String> getAllProperties() {
        Map<String, String> properties = new HashMap<>();

        // Get all property names
        String[] propertyNames = environment.getProperty("spring.config.name", "application").split(",");
        for (String propertyName : propertyNames) {
            String propertyValue = environment.getProperty(propertyName);
            properties.put(propertyName, propertyValue != null ? propertyValue : "null");
        }

        return properties;
    }

字符串
我检查了application.properties文件位于src/main/resources下,文件名为application.properties
让我知道我想达到的目标是否可行。

djp7away

djp7away1#

你的属性在资源中,写入资源是个坏主意。
当然,您可以编写一个单独的方法,它将从属性文件中读取,但是当您在WAR或JAR中构建项目时,您会遇到问题
创建一个隐藏文件夹,把你想要的东西放在那里

vawmfj5a

vawmfj5a2#

请尝试以下代码:

PropertySource<?> propertySource =
    ((AbstractEnvironment) environment)
        .getPropertySources().stream()
            .filter(i -> i instanceof OriginTrackedMapPropertySource)
            .filter(i -> i.getName().contains("application.properties"))
            .findFirst()
            .orElseThrow();
Map<String, String> properties = (Map<String, String>) propertySource.getSource();

字符串
Environment bean包含所有的属性源,但是它需要转换为AbstractEnvironment才能直接访问属性源。然后应该过滤这些属性源,只保留OriginTrackedMapPropertySource s。
最后,按包含文件名的名称过滤属性源。使用contains的原因是其余属性源的名称采用以下格式:
通过位置“optional:classpath:/”配置资源“class path resource [application.properties]”
请记住,这些属性是文件中的原始值,但可以被特定于配置文件的属性覆盖。在这种情况下,environment.getProperty(propertyName)将返回与从上面代码中读取的值不同的值。
供参考:Access all Environment properties as a Map or Properties object

相关问题