列出最终的属性列表 - Spring Cloud Config Server

List final list of properties - Spring Cloud Config Server

Spring 当我访问应用程序的 /env 端点时,云配置服务器接受多个配置文件和 returns 所有配置文件的属性。响应列出了每个配置文件的特定属性。如果相同的 属性 存在于 2 个不同的 属性 文件中,则最后定义的文件优先。有没有办法获取应用程序将使用的 属性 键和值的最终列表?

这似乎是 Spring 框架的有意限制。

here

您可以破解它并注入 PropertySources 接口,然后遍历所有单个 PropertySource 对象,但您必须知道您要查找的属性。

对于云配置客户端应用程序

我尝试了不同的方法并发现了以下内容(无意中):

GET /env/.* returns 配置属性的完整列表

对于云配置服务器应用程序

事实证明这已经实现,但没有很好地记录。您只需要根据模式请求 jsonymlproperties

/{application}-{profile}.{ext}
/{label}/{application}-{profile}.{ext}
import java.util.properties;

import org.springframework.core.env.AbstractEnvironment;
import org.springframework.core.env.CompositePropertySource;
import org.springframework.core.env.Environment;

public class MyClass {
  @Autowired
  private Environment    env;

  Properties getProperties() {
    Properties props = new Properties();
    CompositePropertySource bootstrapProperties = (CompositePropertySource)  ((AbstractEnvironment) env).getPropertySources().get("bootstrapProperties");
    for (String propertyName : bootstrapProperties.getPropertyNames()) {
      props.put(propertyName, bootstrapProperties.getProperty(propertyName));
    }

    return props;
  }

}

抱歉...这是我第一次在这里回答问题。我专门创建了一个帐户 回答这个问题是因为我在研究同一问题时遇到了这个问题。我找到了一个 对我有用并决定分享它的解决方案。

下面是我对所做工作的解释:

  1. 我初始化一个新的 "Properties" 对象(可以是 HashMap 或任何你想要的)

  2. 我为 "bootstrapProperties" 查找 属性 源,它是一个 CompositePropertySource 对象。 此 属性 源包含已加载的所有应用程序属性。

  3. 我循环遍历 CompositePropertySource 对象上 "getPropertyNames" 方法中的所有 属性 名称 return 并创建一个新的 属性 条目。

  4. 我 return 属性对象。

  1. Externalized Configuration

Spring Boot 允许您外部化您的配置,这样您就可以在不同的环境中使用相同的应用程序代码。您可以使用属性文件、YAML 文件、环境变量和命令行参数来外部化配置。 属性 值可以使用 @Value 注释直接注入到你的 bean 中,通过 Spring 的环境抽象访问或通过 @ConfigurationProperties 绑定到结构化对象。

Spring Boot 使用非常特殊的 属性Source 顺序,旨在允许合理地覆盖值。 按以下顺序考虑属性:

  • 主目录上的 Devtools 全局设置属性(~/.spring-boot-devtools.properties 当 devtools 处于活动状态时)。
  • @Test属性测试中的源注释。
  • @SpringBootTest#properties 注释属性。
  • 命令行参数。
  • 来自 SPRING_APPLICATION_JSON 的属性(内联 JSON 嵌入到环境变量或系统 属性 中)
  • ServletConfig 初始化参数。
  • ServletContext 初始化参数。
  • 来自 java 的 JNDI 属性:comp/env.
  • Java 系统属性 (System.getProperties())。
  • OS 环境变量。
  • 一个 RandomValue属性仅具有随机属性的源。*。
  • 打包的 jar 文件之外的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML 变体)
  • 打包在您的 jar 中的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML 变体)
  • 打包 jar 之外的应用程序属性(application.properties 和 YAML 变体)。
  • 打包在您的 jar 中的应用程序属性(application.properties 和 YAML 变体)。
  • @属性@Configuration 上的源注释 类。
  • 默认属性(使用 SpringApplication.setDefaultProperties 指定)。

下面的程序从 spring 引导环境打印属性。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.web.context.support.StandardServletEnvironment;

@Component
public class EnvironmentLogger extends ApplicationObjectSupport {

    @Override
    protected void initApplicationContext(ApplicationContext context) throws BeansException {
        Environment environment = context.getEnvironment();
        String[] profiles = environment.getActiveProfiles();
        if(profiles != null && profiles.length > 0) {
            for (String profile : profiles) {
               System.out.print(profile);
            }           
        } else {
            System.out.println("Setting default profile");
        }

        //Print the profile properties
        if(environment != null && environment instanceof StandardServletEnvironment) {
            StandardServletEnvironment env = (StandardServletEnvironment)environment;
            MutablePropertySources mutablePropertySources = env.getPropertySources();
            if(mutablePropertySources != null) {
                for (PropertySource<?> propertySource : mutablePropertySources) {
                    if(propertySource instanceof MapPropertySource) {
                        MapPropertySource mapPropertySource = (MapPropertySource)propertySource;
                        if(mapPropertySource.getPropertyNames() != null) {
                            System.out.println(propertySource.getName());
                            String[] propertyNames = mapPropertySource.getPropertyNames();
                            for (String propertyName : propertyNames) {
                                Object val = mapPropertySource.getProperty(propertyName);
                                System.out.print(propertyName);
                                System.out.print(" = " + val);
                            }
                        }
                    }
                }
            }
        }
    }
}