Jackson YAMLParser 无法读取输入流

问题描述 投票:0回答:1

我需要处理类路径中的文件。该文件可以是 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 方法不会接受它。

我将不胜感激任何有关如何使其发挥作用的提示。

yaml inputstream jackson-databind jackson-dataformat-yaml
1个回答
0
投票

我确实找到了解决方案。我没有将资源作为流读取,而是执行以下操作:

File configFile = new File(URLDecoder.decode(this.getClass().getClassLoader().getResource(cf).getFile(), "UTF-8"));

并在映射器中将 configStream 替换为 configFile

© www.soinside.com 2019 - 2024. All rights reserved.