我正在编写Apache Storm拓扑,它在命令行中接收配置文件。配置文件是YAML,看起来像这样
#Ports
ports:
- 9998
- 9997
- 9996
我使用snakeyaml和以下代码将配置文件加载到Storm配置中,资源设置为配置yaml文件的路径字符串:
Config conf = new Config();
Yaml yaml = new Yaml()
Map rs = (Map) yaml.load(new InputStreamReader(new FileInputStream(resource)));
conf.putAll(rs);
我已验证Config对象现在包含端口列表。如果我打印“端口”的值,它看起来是以下“[9998,9997,9996]”。
我的问题是如何将其转换为Array,ArrayList或我可以在Java中使用的任何数据结构?我一直在使用带有辅助方法get的backtype.storm.utils.Utils类,但只有当我有一个值而不是值列表时它才有效。
我试过这样称呼它:
String[] ports = Utils.get(conf, "mimes", null);
但是,我得到了一个转换异常。我也尝试过:
String ports = Utils.get(conf, "mimes", null);
检查我是否可以获取整个字符串并且还有一个强制转换异常。我不确定Config对象将此列表存储为什么。一张地图?
任何帮助都将不胜感激。
答案 0 :(得分:1)
我建议使用Jackson的YAML模块(https://github.com/FasterXML/jackson-dataformat-yaml);这就是像DropWizard这样的许多框架。如果是这样,您可以使用与JSON完全相同的数据绑定来构造POJO以进行配置访问:
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Config config = mapper.readValue(fileOrInputStream, Config.class);
int port = mapper.server.port; // or getters, or however your Config object is laid out
答案 1 :(得分:0)
我不确定答案是什么,但我最终将我的snakeyaml版本更新为1.14并且我现在使用yaml.loadAs()方法直接将yaml文件的cotents加载到pojo中。从那里我能够得到我需要的东西。