列出最终的属性列表 - Spring Cloud Config Server
List final list of properties - Spring Cloud Config Server
Spring 当我访问应用程序的 /env 端点时,云配置服务器接受多个配置文件和 returns 所有配置文件的属性。响应列出了每个配置文件的特定属性。如果相同的 属性 存在于 2 个不同的 属性 文件中,则最后定义的文件优先。有没有办法获取应用程序将使用的 属性 键和值的最终列表?
这似乎是 Spring 框架的有意限制。
见here
您可以破解它并注入 PropertySources 接口,然后遍历所有单个 PropertySource 对象,但您必须知道您要查找的属性。
对于云配置客户端应用程序
我尝试了不同的方法并发现了以下内容(无意中):
GET /env/.*
returns 配置属性的完整列表
对于云配置服务器应用程序
事实证明这已经实现,但没有很好地记录。您只需要根据模式请求 json
、yml
或 properties
:
/{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;
}
}
抱歉...这是我第一次在这里回答问题。我专门创建了一个帐户
回答这个问题是因为我在研究同一问题时遇到了这个问题。我找到了一个
对我有用并决定分享它的解决方案。
下面是我对所做工作的解释:
我初始化一个新的 "Properties" 对象(可以是 HashMap 或任何你想要的)
我为 "bootstrapProperties" 查找 属性 源,它是一个 CompositePropertySource 对象。
此 属性 源包含已加载的所有应用程序属性。
我循环遍历 CompositePropertySource 对象上 "getPropertyNames" 方法中的所有 属性 名称 return
并创建一个新的 属性 条目。
我 return 属性对象。
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);
}
}
}
}
}
}
}
}
Spring 当我访问应用程序的 /env 端点时,云配置服务器接受多个配置文件和 returns 所有配置文件的属性。响应列出了每个配置文件的特定属性。如果相同的 属性 存在于 2 个不同的 属性 文件中,则最后定义的文件优先。有没有办法获取应用程序将使用的 属性 键和值的最终列表?
这似乎是 Spring 框架的有意限制。
见here
您可以破解它并注入 PropertySources 接口,然后遍历所有单个 PropertySource 对象,但您必须知道您要查找的属性。
对于云配置客户端应用程序
我尝试了不同的方法并发现了以下内容(无意中):
GET /env/.*
returns 配置属性的完整列表
对于云配置服务器应用程序
事实证明这已经实现,但没有很好地记录。您只需要根据模式请求 json
、yml
或 properties
:
/{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;
}
}
抱歉...这是我第一次在这里回答问题。我专门创建了一个帐户 回答这个问题是因为我在研究同一问题时遇到了这个问题。我找到了一个 对我有用并决定分享它的解决方案。
下面是我对所做工作的解释:
我初始化一个新的 "Properties" 对象(可以是 HashMap 或任何你想要的)
我为 "bootstrapProperties" 查找 属性 源,它是一个 CompositePropertySource 对象。 此 属性 源包含已加载的所有应用程序属性。
我循环遍历 CompositePropertySource 对象上 "getPropertyNames" 方法中的所有 属性 名称 return 并创建一个新的 属性 条目。
我 return 属性对象。
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);
}
}
}
}
}
}
}
}