web-dev-qa-db-fra.com

Quel est le meilleur moyen de charger un fichier yaml dans Map (pas un fichier de configuration d’environnement) dans un projet Web de démarrage printanier?

Dans ma couche d'infrastructure de données, j'aimerais lire un yaml à partir de src/main/resources. Le nom du fichier est mapconfigure.yaml. Il est associé aux données de l'entreprise, pas seulement aux données de configuration de l'environnement.

Son contenu est comme:

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

Je veux stocker cette information dans un HashMap. 

Cela signifie-t-il d'utiliser des annotations à ressort telles que @ConfigurationProperties? Comment y parvenir en détail?

De plus, je ne peux pas changer le nom du fichier. Cela signifie que je dois utiliser mapconfigure.yaml comme nom de fichier, et non pas application.yml ou application.properties.

La structure de mon HashMap est la suivante:

HashMap<String, Setting>

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

Mes attendus HashMap sont comme suit:

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

Je ne sais pas si je peux utiliser la classe YamlMapFactoryBean pour le faire.

Le type de retour de la méthode getObject dans la classe YamlMapFactoryBean est Map<String, Object> et non un type générique, tel que Map<String, T>.

Doc de démarrage de printemps vient de dire 

Spring Framework fournit deux classes pratiques qui peuvent être utilisées pour charger des documents YAML. YamlPropertiesFactoryBean chargera YAML en tant que propriétés et YamlMapFactoryBean chargera YAML en tant que carte.

Mais il n'y a pas d'exemple détaillé.

METTRE &AGRAVE; JOUR:

Dans github, j'ai créé un échantillon. It's Here . Dans cet exemple, je souhaite charger myconfig.yaml dans un objet theMapProperties dans la classe SamplePropertyLoadingTest. La version de démarrage du printemps est 1.5.1, je ne peux donc pas utiliser l'attribut location de @ConfigurationProperties. Comment procéder?

6
niaomingjian

Vous pouvez y parvenir avec @ConfigurationProperties.

À partir de Spring Boot 1.5.x (absence d'emplacement @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
}

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

La classe Person pour les exemples ci-dessus ressemble à ceci:

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

J'ai testé le code avec le fichier suivant: your-filename.yml Défini dans src/main/resources, le contenu:

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

S'il vous plaît laissez-moi savoir si vous avez besoin d'aide supplémentaire.

5
kris_k

essaye ça 

 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.");
        }
1
pvpkiran