在spring boot web项目中将yaml文件加载到Map(而不是环境配置文件)的最佳方法是什么?

nia*_*ian 7 yaml spring-boot

在我的数据框架层中,我想从中读取一个yaml src/main/resources.文件名是mapconfigure.yaml.它与业务数据相关联,而不仅仅与环境配置数据相关联.

其内容如下:

person1: 
  name: aaa
  addresses: 
    na: jiang
    sb: su
person2: 
  name: bbb
  addresses: 
    to: jiang
    bit: su
Run Code Online (Sandbox Code Playgroud)

我想将这些信息存储到HashMap中.

这是否意味着使用一些弹簧注释@ConfigurationProperties?如何在细节上实现这一目标?

另外,我无法更改文件名.这意味着我必须使用mapconfigure.yaml文件名,而不是application.ymlapplication.properties.

我的HashMap 的结构如下:

HashMap<String, Setting>

@Data
public class Setting{
  private String name;
  private HashMap<String, String> addresses
}
Run Code Online (Sandbox Code Playgroud)

预期的HashMap如下:

{person1={name=aaa, addresses={na=jiang, sb=su}}, person2={name=bbb, addresses={to=jiang, bit=su}}}
Run Code Online (Sandbox Code Playgroud)

我不确定我是否可以用YamlMapFactoryBean课来做这件事.

在的返回类型getObject的方法YamlMapFactoryBeanMap<String, Object>,而不是一个泛型类型,喜欢Map<String, T>.

Spring boot doc刚刚说过

Spring Framework提供了两个方便的类,可用于加载YAML文档.YamlPropertiesFactoryBean将YAML作为Properties加载,YamlMapFactoryBean将YAML作为Map加载.

但是没有一个详细的例子.

更新:

在github中,我创建了一个示例.它就在这里.在这个示例中,我想在类中加载myconfig.yamltheMapProperties对象SamplePropertyLoadingTest.Spring启动版本是1.5.1,所以我不能使用location属性@ConfigurationProperties.这该怎么做?

kri*_*s_k 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
}
Run Code Online (Sandbox Code Playgroud)

在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
}
Run Code Online (Sandbox Code Playgroud)

上面示例的Person类如下所示:

public class Person {
    private String name;
    private Map<String, String> addresses;
    // getters and setters are omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)

我用以下文件测试了代码:在src/main/resources中定义的your-filename.yml,内容:

people:
  person1:
    name: "aaa"
    addresses:
      na: "jiang"
      sb: "su"
  person2:
    name: "bbb"
    addresses:
      to: "jiang"
      bit: "su"
Run Code Online (Sandbox Code Playgroud)

如果您需要任何进一步的帮助,请告诉我.