【问题标题】:Jackson Exception when parsing Yaml with a Map of List values使用列表值映射解析 Yaml 时出现杰克逊异常
【发布时间】:2023-04-02 18:57:02
【问题描述】:

我有一个 Yaml 文档,其中包含与列表对应的映射条目。这是一个例子:

environments:
  qa: [ 'us-east-1' ]
  staging: [ 'us-east-1', 'us-west-2' ]

我正在使用 Jackson 2.3.2 将文档解析为使用以下字段和访问器的类:

private Map<String, List<String>> environments = new HashMap<String, List<String>>();

@JsonProperty
public Map<String, List<String>> getEnvironments() {
    return environments;
}

@JsonProperty
public void setEnvironments(Map<String, List<String>> environments) {
    this.environments = environments;
}

我正在使用以下内容测试 Yaml 文件的读取:

inputStream = new FileInputStream("src/test/resources/configuration_test.yml");
config = mapper.readValue(inputStream, MyConfiguration.class);

以下异常是通过堆栈跟踪引发的,但并不是特别有用:

Caused by: java.lang.IllegalArgumentException: Can not find a deserializer for non-concrete Collection type [collection type; class com.google.common.collect.ImmutableList, contains [simple type, class io.dropwizard.metrics.ReporterFactory]]
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.createCollectionDeserializer(BasicDeserializerFactory.java:814)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:392)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:350)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:263)
... 42 more

知道如何让 Jackson 将 Map 值解析为 List 吗?

【问题讨论】:

    标签: java jackson yaml dropwizard


    【解决方案1】:

    我在扩展 dropwizard 的配置类时遇到了同样的问题。正如 CAB 所提到的,使用 Jackson.newObjectMapper 而不是 new ObjectMapper 解决了这个问题。现在我的测试看起来像这样:

    ObjectMapper mapper = Jackson.newObjectMapper(new YAMLFactory());
    
    MyConfiguration myConfig = mapper.readValue(fixture("fixtures/configuration.yml"), MyConfiguration.class);
    
    // Asserts
    

    PS:我正在使用io.dropwizard.testing.FixtureHelpers.fixture 来获取 YAML 文件。

    【讨论】:

    • 我不能做同样的事情,因为 newObjectMapper() 不接受任何参数。
    • 您使用的是哪个 dropwizard 版本?
    • Dropwizard 版本为 0.7.1
    • 我使用的是 0.8,Jackson 类是 dropwizard io.dropwizard.jackson 的一部分。您可以升级您的 DW 版本或使用ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
    【解决方案2】:

    您需要正确配置您的 ObjectMapper。在dropwizard中,有Jackson.newObjectMapper()

    【讨论】:

      【解决方案3】:

      这实际上是由于我的绑定类从 DropWizard 的“配置”类扩展而来。当使用不是从 DropWizard 'Configuration' 类扩展的绑定类时,解析问题中提到的 Yaml 工作正常。

      值得注意的是,该异常仅在运行 JUnit 测试(当然是 TDD)时发生,而不是在运行 DropWizard 应用程序时发生。应用正常启动时读取Yaml文件时没有发生异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-29
        • 2012-11-15
        • 2016-01-20
        • 1970-01-01
        • 2014-07-25
        • 2014-08-22
        • 2012-11-19
        • 2022-01-13
        相关资源
        最近更新 更多