Spring Cloud Config Server接受多个配置文件,并在访问应用程序的/ env端点时返回所有配置文件的属性。响应列出了特定于每个配置文件的属性。如果2个不同的属性文件中存在相同的属性,则最后定义的属性优先。有没有办法获得应用程序将使用的属性键和值的最终列表?
答案 0 :(得分:7)
适用于云配置客户端应用
我尝试了不同的方法并发现了以下情况(意外):
GET /env/.*
返回配置属性的完整列表
适用于云配置服务器应用程序
事实证明这已经实施,但没有很好地记录。您只需根据模式请求json
,yml
或properties
:
/{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;
}
}
对不起......这是我第一次在这里回答问题。我特意创建了一个帐户 回答这个问题,因为我在研究同样的问题时遇到了这个问题。我发现了一个 解决方案对我有用,并决定分享它。
以下是对所做工作的解释:
我初始化一个新的“属性”对象(可能是HashMap或其他任何你想要的东西)
我查找属性源为“bootstrapProperties”,它是一个CompositePropertySource对象。 此属性源包含已加载的所有应用程序属性。
我循环遍历CompositePropertySource对象上“getPropertyNames”方法返回的所有属性名称 并创建一个新的属性条目。
我返回属性对象。
答案 2 :(得分:3)
这似乎是Spring Framework的故意限制。
请参阅here
你可以破解它并注入PropertySources接口,然后遍历所有单独的PropertySource对象,但你必须知道你正在寻找什么属性。
答案 3 :(得分:2)
Spring Boot允许您外部化配置,以便在不同环境中使用相同的应用程序代码。您可以使用属性文件,YAML文件,环境变量和命令行参数来外部化配置。可以使用@Value注释将属性值直接注入到bean中,通过Spring的Environment抽象访问或通过@ConfigurationProperties绑定到结构化对象。
Spring Boot使用一个非常特殊的PropertySource命令,旨在允许合理地覆盖值。 按以下顺序考虑属性:
以下程序从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);
}
}
}
}
}
}
}
}