Jackson 因“无法构造 WorkpoolId 的实例(尽管至少存在一个 Creator)而失败:没有 int/Int-argument 构造函数/工厂”

Posted

技术标签:

【中文标题】Jackson 因“无法构造 WorkpoolId 的实例(尽管至少存在一个 Creator)而失败:没有 int/Int-argument 构造函数/工厂”【英文标题】:Jackson fails with "Cannot construct instance of WorkpoolId (although at least one Creator exists): no int/Int-argument constructor/factory" 【发布时间】:2021-01-30 01:10:49 【问题描述】:

我有以下课程

public class WorkpoolId implements Serializable 

    @NotNull
    private Long id = null;

    @JsonCreator
    public WorkpoolId(@JsonProperty("workpoolId") long id) 
        this.id = Long.valueOf(id);
    

    public WorkpoolId(Long id) 
        this.id = id;
    

    public WorkpoolId(String id) 
        this.id = Long.valueOf(id);
    

    private WorkpoolId() 
    

映射时

"workpoolId":1

这门课我得到了一个

javax.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.MismatchedInputException: 无法构造 WorkpoolId 的实例(尽管至少存在一个 Creator):没有 int/Int-argument 构造函数/工厂方法从数值 (1) 反序列化

为什么杰克逊不能使用长构造函数来获取数值?

【问题讨论】:

【参考方案1】:

它失败是因为您的WorkpoolId 无权访问字段workpoolId 它不在其上下文中。当您的 JSON 被反序列化时,它可以被反序列化为

独立对象(没有字段workpoolId,它ISworkbookId) 对象中的字段对象值包含 -say Data - 它 可能被命名为 workpoolId

现在Data 中的JsonCreator 在构造其字段workpoolId 时可以使用workbookId。

为了澄清这一点,这里是一个可能的 Data 类的示例:

@Getter @Setter
public class Data 
    private WorkpoolId workpoolId;
    @JsonCreator // here it is a property!
    public Data(@JsonProperty("workpoolId") long id) 
        this.workpoolId = new WorkpoolId(id);
     

Json 就像"workpoolId":1

要让它工作,只需从属性声明中删除注释@JsonProperty("workpoolId")。实际上不需要整个@JsonCreator 注释。

【讨论】:

以上是关于Jackson 因“无法构造 WorkpoolId 的实例(尽管至少存在一个 Creator)而失败:没有 int/Int-argument 构造函数/工厂”的主要内容,如果未能解决你的问题,请参考以下文章

记一次RestTemplate消息类型不匹配的BUG定位

记一次RestTemplate消息类型不匹配的BUG定位

记一次RestTemplate消息类型不匹配的BUG定位

Jackson怎么读 英语jackson怎么读

Jackson:从 XSD 生成 Jackson 类

Jackson和FastJson性能谁更快