Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the best way to load a yaml file to Map(not an environment configuration file) in spring boot web project?

In my data framework layer, I'd like to read an yaml from src/main/resources. The file name is mapconfigure.yaml. It's associated with the business data, not just environment configuration data.

Its content's like:

person1: 
  name: aaa
  addresses: 
    na: jiang
    sb: su
person2: 
  name: bbb
  addresses: 
    to: jiang
    bit: su

I want to store this information into a HashMap.

Does it mean to use some spring annotation like @ConfigurationProperties? How to achieve this in details?

In addition, I can't change the file name. It means I have to use mapconfigure.yaml as the file name, not application.yml or application.properties.

The structure of my HashMap is as follows:

HashMap<String, Setting>

@Data
public class Setting{
  private String name;
  private HashMap<String, String> addresses
}

My expected HashMap's as follows:

{person1={name=aaa, addresses={na=jiang, sb=su}}, person2={name=bbb, addresses={to=jiang, bit=su}}}

I'm not sure if I can use YamlMapFactoryBean class to do this.

The return type of the getObject method in YamlMapFactoryBean class is Map<String, Object>, not a generic type, like Map<String, T>.

Spring boot doc just said

Spring Framework provides two convenient classes that can be used to load YAML documents. The YamlPropertiesFactoryBean will load YAML as Properties and the YamlMapFactoryBean will load YAML as a Map.

But there isn't a detailed example.

UPDATE:

In github, I created a sample. It's Here. In this sample, I want to load myconfig.yaml to theMapProperties object in SamplePropertyLoadingTest class. Spring boot version is 1.5.1, so I can't use location attribute of @ConfigurationProperties. How to do this?

like image 956
niaomingjian Avatar asked Mar 29 '17 11:03

niaomingjian


Video Answer


1 Answers

You can indeed achieve this with @ConfigurationProperties.

From Spring Boot 1.5.x onwards (lack of @ConfigurationProperies locations 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
}

In 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
}

The Person class for above examples looks like this:

public class Person {
    private String name;
    private Map<String, String> addresses;
    // getters and setters are omitted for brevity
}

I have tested the code with the following file: your-filename.yml defined in src/main/resources, the contents:

people:
  person1:
    name: "aaa"
    addresses:
      na: "jiang"
      sb: "su"
  person2:
    name: "bbb"
    addresses:
      to: "jiang"
      bit: "su"

Please let me know if you need any further assistance.

like image 189
kris_k Avatar answered Nov 03 '22 00:11

kris_k