【问题标题】:com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No value type configured for ObjectReadercom.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有为 ObjectReader 配置值类型
【发布时间】:2020-01-15 01:33:16
【问题描述】:

我在执行以下代码时收到com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No value type configured for ObjectReader 问题

杰克逊版本是jackson-databind-2.9.9.jar

public <T> T parsingData(String body) {
  try {
    return getObjectMapper().reader().readValue(body);
  } catch (IOException ioe) {
     ioe.printStackTrace();
  }
}

在我进入printStackTrace 的确切异常下方,可以找到暴露在异常中的String body

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No value type configured for ObjectReader
at [Source: (String)"{
     "timestamp": "2019-06-04T09:36:50.086+02:00",
     "path": "/api/check/85358/checking/246syb-f3f2-4756-91da-dae3e8ce774b/test/22462da-c4e2-45ca-bd27-246/rows/8bc3965a-ae22-4d7f-b770-262sgs24/port",
     "status": 400,
     "error": "Internal Server Error",
     "message": "[owner.firstName2:size:1:30, owner.lastName2:size:1:30]",
     "errorCode": 200000
    }
    "; line: 1, column: 1]

更新:您能否解释一下为什么我会收到此异常?是不是因为我没有提供ClassTypeReference

【问题讨论】:

  • 嗨 Michat ziober。自从 ObjectMapper 读取值以来,提供的链接无法解决我的问题。这里我正在使用 ObjectReader 阅读。
  • 但是没有大的区别,你写信改成:getObjectMapper().readValue(body, clazz);。如果不提供ClassTypeReference,您将无法读取对象。如果您想在不提供课程的情况下阅读JSON,您可以期待MapList - 仅此而已。
  • 好的,谢谢 Michal,但是你能告诉我为什么我得到这个异常吗?这是因为我没有提供任何ClassTypeReference。?如果是这样,但基于杰克逊库,代码有意义吗?
  • 请使用jsonlint.com验证您的json

标签: java jackson jackson-databind


【解决方案1】:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 否 为 ObjectReader 配置的值类型

意思是,Jackson 不知道您想反序列化到哪种类型。由于Type Erasure in Java,它不起作用。

当你绑定一个类时它会起作用:

public static <T> T parsingData(String body) throws IOException {
    return new ObjectMapper().readerFor(A.class).readValue(body);
}

或使用Class 参数:

public static <T> T parsingData(String body, Class<T> clazz) throws IOException {
    return new ObjectMapper().readerFor(clazz).readValue(body);
}

查看readValue 方法的类似问题以及如何解决它:How do I parametrize response parsing in Java?

要了解readValue mehtod,我们需要看看documentation

使用此阅读器的配置绑定从给定 JSON 字符串读取的内容的方法。返回值要么是新构造的,要么是使用指定的根值 withValueToUpdate(Object)。

但在您的代码中,您使用了纯阅读器,没有任何配置。

如果您不知道类型,只需将JSON 反序列化为JsonNode,这可能是最通用的方式:

JsonNode root = new ObjectMapper().readTree(json);

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 2019-12-14
    • 2021-05-04
    • 2022-06-30
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2016-09-14
    • 2021-12-19
    相关资源
    最近更新 更多