在 Spring 启动 Web 项目中将 yaml 文件加载到 Map(不是环境配置文件)的最佳方法是什么?



在我的数据框架层中,我想从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.ymlapplication.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.");
}

相关内容

  • 没有找到相关文章

最新更新