在我的数据框架图层中,我想从src/main/resources
读取一个yaml。
文件名为mapconfigure.yaml
。它与业务数据相关联,而不仅仅是环境配置数据。
其内容如下:
person1:
name: aaa
addresses:
na: jiang
sb: su
person2:
name: bbb
addresses:
to: jiang
bit: su
我想将此信息存储到HashMap中。
使用像@ConfigurationProperties
这样的弹簧注释是否意味着什么?
如何详细实现这一目标?
此外,我无法更改文件名。这意味着我必须使用mapconfigure.yaml
作为文件名,而不是application.yml
或application.properties
。
我的HashMap的结构如下:
HashMap<String, Setting>
@Data
public class Setting{
private String name;
private HashMap<String, String> addresses
}
我的预期的HashMap &#39;如下:
{person1={name=aaa, addresses={na=jiang, sb=su}}, person2={name=bbb, addresses={to=jiang, bit=su}}}
我不确定我是否可以使用YamlMapFactoryBean
类来执行此操作。
getObject
类YamlMapFactoryBean
方法的返回类型为Map<String, Object>
,而不是通用类型,如Map<String, T>
。
Spring boot doc刚刚说过
Spring Framework提供了两个方便的类,可用于加载YAML文档。 YamlPropertiesFactoryBean将YAML作为Properties加载,YamlMapFactoryBean将YAML作为Map加载。
但是没有一个详细的例子。
更新:
在github中,我创建了一个样本。 It's Here。
在此示例中,我想在myconfig.yaml
类中加载theMapProperties
到SamplePropertyLoadingTest
对象。 Spring启动版本为1.5.1,因此我无法使用location
的{{1}}属性。
怎么做?
答案 0 :(得分:5)
您确实可以使用@ConfigurationProperties实现此目的。
从Spring Boot 1.5.x开始(缺少@ConfigurationProperies位置attr。):
new SpringApplicationBuilder(Application.class)
.properties("spring.config.name=application,your-filename")
.run(args);
@Component
@ConfigurationProperties
public class TheProperties {
private Map<String, Person> people;
// getters and setters are omitted for brevity
}
在Spring Boot 1.3.x中:
@Component
@ConfigurationProperties(locations = "classpath:your-filename.yml")
public class TheProperties {
private Map<String, Person> people;
// getters and setters are omitted for brevity
}
以上示例的Person类如下所示:
public class Person {
private String name;
private Map<String, String> addresses;
// getters and setters are omitted for brevity
}
我使用以下文件测试了代码:your-filename.yml 在src / main / resources中定义,内容为:
people:
person1:
name: "aaa"
addresses:
na: "jiang"
sb: "su"
person2:
name: "bbb"
addresses:
to: "jiang"
bit: "su"
如果您需要任何进一步的帮助,请与我们联系。
答案 1 :(得分:2)
试试这个
YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
try {
PropertySource<?> applicationYamlPropertySource = loader.load(
"properties", new ClassPathResource("application.yml"), null);// null indicated common properties for all profiles.
Map source = ((MapPropertySource) applicationYamlPropertySource).getSource();
Properties properties = new Properties();
properties.putAll(source);
return properties;
} catch (IOException e) {
LOG.error("application.yml file cannot be found.");
}