我如何以与使用@ configationproperties相同的方式以编程方式加载yaml文件
How do i load a yaml file programatically the same way as using @ConfiguationProperties?
不确定这是否是个问题,或者我只是没有以正确的方式去做。我的问题是,我试图以2种方式加载YAML文件。一种方法是通过@configurationProperties并指定一个位置。这工作得很好,并且YAML被正确加载到我的Java对象中。
PageDescriptor.java
import java.util.HashMap;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(locations = "classpath:config/page.yml")
public class PageDescriptor {
private HashMap pageConfigs;
public PageDescriptor() {
}
public HashMap<String, PageConfig> getPageConfigs() {
return pageConfigs;
}
public void setPageConfigs(final HashMap<String, PageConfig> pageConfigs) {
this.pageConfigs = pageConfigs;
}
PageConfig.java
public class PageConfig {
private String baseUrl;
private String configLocation;
private String navDescriptorKey;
private String defaultRoute;
public PageConfig() {
}
public String getBaseUrl() {
return baseUrl;
}
public void setBaseUrl(final String baseUrl) {
this.baseUrl = baseUrl;
}
public String getDefaultRoute() {
return defaultRoute;
}
public void setDefaultRoute(final String defaultRoute) {
this.defaultRoute = defaultRoute;
}
public String getNavDescriptorKey() {
return navDescriptorKey;
}
public void setNavDescriptorKey(final String navDescriptorKey) {
this.navDescriptorKey = navDescriptorKey;
}
public String getConfigLocation() {
return configLocation;
}
}
下一步我试图加载其他YAML文件到同一对象,但通过java代码。我是这样接近它的。
测试提取配置的代码:
final PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
final Resource[] resources = resourceResolver.getResources("classpath*:com/**/page.yml");
if (!((resources == null) || (resources.length == 0))) {
for (final Resource resource : resources) {
// final Yaml yaml = new Yaml();
// final InputStream in = resource.getInputStream();
// final PageDescriptor componentPageDescriptor = yaml.loadAs(in, PageDescriptor.class);
// in.close();
final YamlConfigurationFactory<PageDescriptor> factory = new YamlConfigurationFactory<PageDescriptor>(
PageDescriptor.class);
final Map<Class<?>, Map<String, String>> aliases = new HashMap<Class<?>, Map<String, String>>();
// aliases.put(PageConfig.class, Collections.singletonMap("pageConfig", "pageConfig"));
factory.setResource(resource);
factory.setExceptionIfInvalid(true);
factory.setPropertyAliases(aliases);
// factory.setValidator(validator);
factory.setMessageSource(new StaticMessageSource());
factory.afterPropertiesSet();
final PageDescriptor componentPageDescriptor = factory.getObject();
}
}
当这将componentPageDescriptor对象加载为PageDescriptor时,它没有正确加载HashMap,而是正确加载HashMap>。是否有一种简单的方法来模拟@ConfigurationProperties在加载YAML文件时的工作方式?
下面是YAML文件
---
#pageDescriptors:
pageConfigs:
Home:
baseUrl: ""
configLocation: "/static/app/src/scripts/pages/home/config.js"
navDescriptorKey: "Default"
defaultRoute: ""
更新:作为临时解决方案,我能够将YAML转换为对象到JSON到PageDescriptor,它按预期工作。
final PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
final Resource[] resources = resourceResolver
.getResources("classpath*:com/**/page.yml");
if (!((resources == null) || (resources.length == 0))) {
for (final Resource resource : resources) {
final Yaml yaml = new Yaml();
final Object map = yaml.load(resource.getInputStream());
final ObjectWriter ow = new ObjectMapper().writer();
final String componentPageDescriptorString = ow.writeValueAsString(map);
final PageDescriptor componentPageDescriptor = new ObjectMapper()
.readValue(componentPageDescriptorString, PageDescriptor.class);
pageDescriptor.merge(componentPageDescriptor);
}
}
可能的解决方案不是最好的,但可以完成工作。我能够将YAML转换为对象到JSON到PageDescriptor,它按预期工作。
final PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
final Resource[] resources = resourceResolver
.getResources("classpath*:com/**/page.yml");
if (!((resources == null) || (resources.length == 0))) {
for (final Resource resource : resources) {
final Yaml yaml = new Yaml();
final Object map = yaml.load(resource.getInputStream());
final ObjectWriter ow = new ObjectMapper().writer();
final String componentPageDescriptorString = ow.writeValueAsString(map);
final PageDescriptor componentPageDescriptor = new ObjectMapper()
.readValue(componentPageDescriptorString, PageDescriptor.class);
pageDescriptor.merge(componentPageDescriptor);
}
}
这个问题的解决方案是首先使用objectMapper将YAML转换为映射,然后将该映射转换为.properties文件。
转换为映射
Map<String, Object> configMap = new HashMap<String, Object>();
File yamlFile = new File(yamlLocation);
Yaml yaml = new Yaml();
InputStream input = new FileInputStream(yamlFile);
configMap = (Map<String, Object>) yaml.load(input);
现在使用这个map的map,您可以使用自定义逻辑轻松地将它映射到。properties文件。
你也可以在代码中使用这个映射来读取属性
相关文章:
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 以编程方式选择文本Mobile Safari
- Thunderbird,如何以编程方式选择第一个选项卡
- 以编程方式获取无线接入点列表
- 使用Javascript/jQuery以编程方式将当前锚点/哈希/片段附加到任何表单操作url
- 通过javascript以编程方式将文件插入HTML输入
- 如何以非编程方式国际化HTML文本
- Y组合器如何以编程方式计算不动点
- 如何以编程方式添加到可变嵌套对象中
- 在视图中渲染多个按钮以编程方式进行本机反应
- 为什么我在以编程方式打开窗口时遇到问题
- 以编程方式添加的复选框的值
- 以编程方式将fabric-js-canvas的图像替换为hq图像,并重新计算其他对象的坐标和大小
- 可以't以编程方式关闭jQuery移动弹出窗口中的可折叠部分
- 以编程方式调用javascript函数
- 如何以编程方式查找javascript语法错误的位置
- 以编程方式将特定的JavaScript添加到Qualtrics中的特定问题中
- 当以编程方式更改输入值时,不会执行更改时事件
- 如何以编程方式在 jsTree 中选择一个节点并打开所有父节点
- 以编程方式打开<选择>选取器