首页 > 解决方案 > com.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有为 ObjectReader 配置值类型

问题描述

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]

更新:你能解释一下为什么我会收到这个例外吗?这是因为我没有提供Class还是TypeReference

标签: javajacksonjackson-databind

解决方案


com.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有为 ObjectReader 配置值类型

意思是,Jackson不知道你想反序列化到哪种类型。由于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方法问题以及如何解决它:如何在 Java 中参数化响应解析?

要了解readValue方法,我们需要查看文档

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

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

如果您不知道一种类型,只需反序列JSONJsonNode这可能是最通用的方式:

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

推荐阅读