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

6

执行下面的代码时,我遇到了com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No value type configured for ObjectReader问题。

Jackson版本为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吗?


可能是如何在Java中参数化响应解析?的重复问题。 - Michał Ziober
嗨,Michat ziober。提供的链接并没有解决我的问题,因为我是使用ObjectReader来读取值,而不是ObjectMapper。 - Rence Abishek
但是并没有太大的区别,你只需要写成这样:getObjectMapper().readValue(body, clazz);。如果不提供 ClassTypeReference,则无法读取对象。如果想要在不提供类的情况下读取 JSON,则只能期望得到 MapList - 没有其他更多的选择。 - Michał Ziober
好的,谢谢Michal。但是你能告诉我为什么我会得到这个异常吗?是因为我没有提供任何“Class”或“TypeReference”吗?如果是这样,但基于jackson库,代码是有意义的,对吧? - Rence Abishek
请使用 https://jsonlint.com/ 验证您的 JSON。 - Bheem Singh
1个回答

12

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)指定的根值。”
但是,在您的代码中,您使用了没有任何配置的纯阅读器。
如果您不知道类型,请将JSON反序列化为JsonNode,这可能是最通用的方式:
JsonNode root = new ObjectMapper().readTree(json);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接