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

时间:2017-05-22 21:14:08

标签: spring-boot spring-cloud-netflix spring-cloud-config

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

4 个答案:

答案 0 :(得分:7)

适用于云配置客户端应用

我尝试了不同的方法并发现了以下情况(意外):

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

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

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

/{application}-{profile}.{ext}
/{label}/{application}-{profile}.{ext}

答案 1 :(得分:5)

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. 我初始化一个新的“属性”对象(可能是HashMap或其他任何你想要的东西)

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

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

  4. 我返回属性对象。

答案 2 :(得分:3)

这似乎是Spring Framework的故意限制。

请参阅here

你可以破解它并注入PropertySources接口,然后遍历所有单独的PropertySource对象,但你必须知道你正在寻找什么属性。

答案 3 :(得分:2)

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

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

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

    以下程序从spring boot环境打印属性。

    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);
                                }
                            }
                        }
                    }
                }
            }
        }
    }