【发布时间】:2016-03-07 22:19:26
【问题描述】:
使用 Spring Boot 1.3.0.RELEASE
我有几个 yaml 文件,它们描述了一个程序的多个实例。我现在想将所有这些文件解析为List<Program>(地图,随便),以便稍后在所有程序中为给定条件搜索最合适的实例。
我非常喜欢@ConfigurationProperties 的方法,它对于单个 yaml 文件来说已经足够好了,但我还没有找到一种方法来使用该方法读取目录中的所有文件。
适用于单个文件的当前方法:
programs/program1.yml
name: Program 1
minDays: 4
maxDays: 6
可以阅读
@Configuration
@ConfigurationProperties(locations = "classpath:programs/program1.yml", ignoreUnknownFields = false)
public class ProgramProperties {
private Program test; //Program is a POJO with all the fields in the yml.
//getters+setters
我尝试将位置更改为列出我所有文件locations = {"classpath:programs/program1.yml", "classpath:programs/program2.yml"} 的数组以及使用locations = "classpath:programs/*.yml",但这仍然只加载第一个文件(数组方法)或根本不加载(通配符方法)。
所以,我的问题是,在 Spring Boot 中,将一堆 yaml 文件加载到类路径目录中并将它们解析为(列表)POJO 的最佳方法是什么,以便它们可以在控制器中自动装配?我需要直接使用Snakeyaml,还是有一个我还没有找到的集成机制?
编辑: 一种可行的方法是手动进行:
private static final Yaml yaml = new Yaml(new Constructor(Program.class));
private static final ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
for (Resource resource : resolver.getResources("/programs/*.yml")) {
Object data = yaml.load(resource.getInputStream());
programList.add((Program) data);
}
}
catch (IOException ioe) {
logger.error("failed to load resource", ioe);
}
【问题讨论】:
-
通配符在 AFAIK 中不起作用,但使用数组应该可以,但是您似乎忘记了其中的
classpath:前缀。 -
感谢您的输入,我在上面编辑了我的文本 - 因为我在尝试时自然地在我的代码中使用了它。但是,如果这种方法应该有效,我将如何编写我的类(或更改 yaml 结构?)程序不仅填充了第一个 yaml 文件中的数据,而且成为所有不同的程序?
标签: java spring spring-boot snakeyaml