【问题标题】:How to load all key/value pairs in properties file如何在属性文件中加载所有键/值对
【发布时间】:2016-04-11 16:42:59
【问题描述】:

我正在尝试将所有 key/value 对加载到我的属性文件中。

一种方法是我手动使用@Value 加载所有属性,但为此我应该知道所有键。

我不能这样做,因为将来可能会更改属性文件以包含更多 key/value 对,我可能需要再次修改 code 以适应它们。

第二种方法是我应该了解如何加载属性文件并对其进行迭代以在不知道密钥的情况下加载所有 key/value 对。

假设我有以下属性文件sample.properties

property_set.name="Database MySQL"
db.name=
db.url=
db.user=
db.passwd=

property_set.name="Database Oracle"
db.name=
db.url=
db.user=
db.passwd=

这就是我想要做的事情

@Configuration
@PropertySource(value="classpath:sample.properties")
public class AppConfig {
    @Autowired
    Environment env;

    @Bean
    public void loadConfig(){
    //Can I some how iterate over the loaded sampe.properties and load all
    //key/value pair in Map<String,Map<String, String>>
    // say Map<"Database MySQL", Map<key,vale>>
    // I cannot get individual properties like env.getProperty("key"); 
    // since I may not know all the keys
}
}

【问题讨论】:

  • 您当前的属性文件将加载,但只有最后一个属性会在其中...正如您所说,这是一个键/值的东西,并且键在您的情况下必须是唯一的。 t 独一无二的。
  • @M.Deinum property_set 本身就是一个键,下面有一组键。我不确定它会如何影响我的实施。
  • 不,这不是属性文件的工作方式。 db.name 将覆盖 db.name。不管前面说什么。
  • 你是对的,如果我为每组设置唯一的键怎么样。说db.name.msdb.name.or。我想要的只是加载它们而不用担心键。

标签: java spring properties spring-boot


【解决方案1】:

Spring 将所有属性存储在 Environment 中。 Environment 包含 PropertySource 的集合。每个PropertySource 都包含来自特定来源的属性。还有系统属性,以及java环境属性等等。您文件中的属性也将在那里。

任何来源都有自己的名字。在您的情况下,自动生成的名称将类似于 "class path resource [sample.properties]"。如你所见,这个名字不是那么方便。所以让我们设置更方便的名称:

@PropertySource(value="classpath:sample.properties", name="sample.props")

现在您可以通过此名称获取源代码:

AbstractEnvironment ae = (AbstractEnvironment)env;
org.springframework.core.env.PropertySource source =
                              ae.getPropertySources().get("sample.props");
Properties props = (Properties)source.getSource();

注意我指定了PropertySource类的全名,以避免与@PropertySource注解类冲突。之后,您可以使用属性。例如将它们输出到控制台:

for(Object key : props.keySet()){
   System.out.println(props.get(key));
}

【讨论】:

  • 这对我来说效果很好...给你一个酋长!
  • “env”从何而来?当我使用@Autowired Environment env 得到 null 并且我的包也是正确的
【解决方案2】:

可以在jdk api中查找Properties类,使用方法load(InputStream inStream)

InputStream in = new FileInputStream("your properties location");
Properties prop = new Properties();
prop.load(in);

ps: prop 是 HashTable 的子类,不要忘记关闭流

【讨论】:

  • @PropertySource 会处理这个问题。此外,这不是spring 的做法。
【解决方案3】:

您可以在包含方法getPropertyNames()EnumerablePropertySourceautowire

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多