JSON 解析错误:无法构造 `com.dto.IdDTO` 的实例(尽管至少存在一个 Creator)
Posted
技术标签:
【中文标题】JSON 解析错误:无法构造 `com.dto.IdDTO` 的实例(尽管至少存在一个 Creator)【英文标题】:JSON parse error: Cannot construct instance of `com.dto.IdDTO` (although at least one Creator exists) 【发布时间】:2020-06-14 20:35:17 【问题描述】:我有一个使用 Azul 的 2.2.4 版和 Zulu Java 11.0.5 的 Spring Boot 应用程序。它正在访问部署在 Payara Web 服务器(版本 5.194)上的 REST Web 服务。
我正在使用以下 DTO:
public class IdDTO extends BasicResponseDTO
private long id;
public IdDTO(long id)
this.id = id;
public long getId()
return id;
public void setId(long id)
this.id = id;
和
public class BasicResponseDTO implements Serializable
private String errorCode;
public BasicResponseDTO()
this.setErrorCode(null);
public String getErrorCode()
return errorCode;
public void setErrorCode(String errorCode)
this.errorCode = errorCode;
我调用了一个 REST Web 服务,我看到我从 Postman 收到(正确)以下响应:
"errorCode": null,
"id": 3534016
但是,当我检索响应时,出现以下异常:
class org.springframework.web.client.RestClientException/Error while extracting response for type [class com.dto.IdDTO] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `com.dto.IdDTO` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.dto.IdDTO` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (PushbackInputStream); line: 1, column: 2]
有没有人知道为什么应用程序无法将接收到的 JSON 映射到对象?
附: 1) 我还有其他扩展 BasicResponseDTO 的 DTO,并且反序列化对它们很好。
附: 2) 服务端和客户端的类定义是一样的。
【问题讨论】:
这能回答你的问题吗? JSON parse error: Can not construct instance of io.starter.topic.Topic 【参考方案1】:IdDTO 上没有默认构造函数。只有一个带id的:
public IdDTO(long id)
this.id = id;
你必须添加一个:
public IdDTO()
这是 JSON 反序列化从您的类构造对象所需要的
【讨论】:
谢谢!!我花了几个小时调试这个。【参考方案2】:这里已经回答了这个问题:JSON parse error: Can not construct instance of io.starter.topic.Topic
在一般设计方面,我强烈建议使用第二个解决方案来注释构造函数,而不是默认参数构造函数。这样您就可以拥有不可变字段(将它们设为final
)并确保您不接受空值。在 2020 年,由于序列化遗留设计,我会考虑使用默认构造函数的任何设计。
【讨论】:
以上是关于JSON 解析错误:无法构造 `com.dto.IdDTO` 的实例(尽管至少存在一个 Creator)的主要内容,如果未能解决你的问题,请参考以下文章
找不到模块:错误:无法解析“流”或 TypeError:stream.Readable 不是构造函数
无法解析片段中的 ViewModelProvider 构造?
反序列化类时出现“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”错误