我需要处理类路径中的文件。该文件可以是 JSON 或 YAML。虽然 JSON 处理得非常好,但 YAML 确实让我有些悲伤。 这是我的代码:
private Configurator processCofigFile(String cf) throws IOException {
InputStream configStream;
ObjectMapper mapper;
//get configuration from classpath resource
configStream = this.getClass().getClassLoader().getResourceAsStream(cf);
if(cf.endsWith("json")) {
mapper = new ObjectMapper();
} else if(cf.endsWith("yml") || cf.endsWith("yaml")) {
mapper = new ObjectMapper(new YAMLFactory());
} else {
LOG.error("Unrecognized configuration format");
throw new IllegalStateException("Unrecognized configuration format");
}
return mapper.readValue(configStream, Configurator.class);
}
我遇到以下异常:
java.lang.NoSuchMethodError:'void org.yaml.snakeyaml.parser.ParserImpl。(org.yaml.snakeyaml.reader.StreamReader)' 在 com.fasterxml.jackson.dataformat.yaml.YAMLParser.
(YAMLParser.java:159) 在com.fasterxml.jackson.dataformat.yaml.YAMLFactory._createParser(YAMLFactory.java:455) 在com.fasterxml.jackson.dataformat.yaml.YAMLFactory.createParser(YAMLFactory.java:357) 在com.fasterxml.jackson.dataformat.yaml.YAMLFactory.createParser(YAMLFactory.java:14) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3809)
看起来 SnakeYaml 解析器没有接受 InputStream 的构造函数,只有 File 或 Reader。我可以创建 InputStreamReader,但 readValue 方法不会接受它。
我将不胜感激任何有关如何使其发挥作用的提示。
我确实找到了解决方案。我没有将资源作为流读取,而是执行以下操作:
File configFile = new File(URLDecoder.decode(this.getClass().getClassLoader().getResource(cf).getFile(), "UTF-8"));
并在映射器中将 configStream 替换为 configFile。