【问题标题】:Jackson fails with "Cannot construct instance of WorkpoolId (although at least one Creator exists): no int/Int-argument constructor/factory"Jackson 因“无法构造 WorkpoolId 的实例(尽管至少存在一个 Creator)而失败:没有 int/Int-argument 构造函数/工厂”
【发布时间】: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) 反序列化

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

【问题讨论】:

    标签: jackson


    【解决方案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 注释。

    【讨论】:

      猜你喜欢
      • 2022-12-12
      • 2020-01-17
      • 2018-11-22
      • 2021-09-17
      • 2019-07-28
      • 2020-06-14
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      相关资源
      最近更新 更多