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