在我的数据框架层中,我想从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<String, Setting>
@Data
public class Setting{
private String name;
private HashMap<String, String> addresses
}
我预期的哈希图如下:
{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 框架提供了两个方便的类,可用于加载 YAML 文档。YamlPropertiesFactoryBean将加载YAML作为属性,YamlMapFactoryBean将加载YAML作为Map。
但没有详细的例子。
更新:
在 github 中,我创建了一个示例。就在这里。 在此示例中,我想将myconfig.yaml
加载到类theMapProperties
对象SamplePropertyLoadingTest
。Spring boot版本是1.5.1,所以我不能使用@ConfigurationProperties
的属性location
。 怎么做?
你确实可以用@ConfigurationProperties来实现这一点。
从 Spring Boot 1.5.x 开始(缺少@ConfigurationProperies位置):
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
}
我已经使用以下文件测试了代码:您的文件名.yml 在 src/main/Resources 中定义的内容:
people:
person1:
name: "aaa"
addresses:
na: "jiang"
sb: "su"
person2:
name: "bbb"
addresses:
to: "jiang"
bit: "su"
如果您需要任何进一步的帮助,请告诉我。
试试这个
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.");
}