如何打印Spring Boot加载的所有配置?

时间:2017-02-23 10:16:33

标签: java spring-boot

我想在屏幕上打印从配置文件加载的所有属性。我该怎么做?我找不到太多关于此的信息。

这是因为我可以使用参数 - spring.config.location 加载配置文件,我想看看我是否正确加载了文件。

我正在寻找一个控制台解决方案,我可以在流程真正开始执行任务之前打印出来。

3 个答案:

答案 0 :(得分:5)

如果您使用Spring Boot Actuator,您将获得一个显示该信息的/env endpoint

要启用此功能,请将以下依赖项添加到项目中:

super.viewWillLayoutSubviews

输出应如下所示:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

显示所有已加载的配置文件,包括默认值,系统属性,通过配置服务加载的属性,....

答案 1 :(得分:0)

be this of help可以吗?我在Spring Boot问题跟踪器上找到了它。

我将其粘贴以供快速参考,但是请记住原始作者是sandor-nemeth

package de.idealo.ecommerce.order.history.config;

import java.util.Arrays;
import java.util.stream.StreamSupport;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.env.AbstractEnvironment;
import org.springframework.core.env.EnumerablePropertySource;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.stereotype.Component;

@Component
public class PropertyLogger  {

    private static final Logger LOGGER = LoggerFactory.getLogger(PropertyLogger.class);

    @EventListener
    public void handleContextRefresh(ContextRefreshedEvent event) {
        final Environment env = event.getApplicationContext().getEnvironment();
        LOGGER.info("====== Environment and configuration ======");
        LOGGER.info("Active profiles: {}", Arrays.toString(env.getActiveProfiles()));
        final MutablePropertySources sources = ((AbstractEnvironment) env).getPropertySources();
        StreamSupport.stream(sources.spliterator(), false)
                .filter(ps -> ps instanceof EnumerablePropertySource)
                .map(ps -> ((EnumerablePropertySource) ps).getPropertyNames())
                .flatMap(Arrays::stream)
                .distinct()
                .filter(prop -> !(prop.contains("credentials") || prop.contains("password")))
                .forEach(prop -> LOGGER.info("{}: {}", prop, env.getProperty(prop)));
        LOGGER.info("===========================================");
    }
}

答案 2 :(得分:0)

这是我的版本,它将它收集到地图中并使用方法 lambdas 它避免强制转换,因为我自动装配 StandardEnvironment 而不是 Environment。工作方式与上述相同,但不那么传统,我使用了 ::cast 方法引用

    final Map<String, Object> collect = env.getPropertySources()
        .stream()
        .parallel()
        .filter(EnumerablePropertySource.class::isInstance)
        .map(EnumerablePropertySource.class::cast)
        .map(EnumerablePropertySource::getPropertyNames)
        .flatMap(Arrays::stream)
        .collect(HashMap::new, (a, e) -> a.put(e, env.getRequiredProperty(e)), Map::putAll);
    System.out.println(collect);

虽然我通常只做最后一部分进行调试,但我通常会在最后一个平面图上结束并从那里组装我需要的数据。