杰克逊失败 "Cannot construct instance of WorkpoolId (although at least one Creator exists): no int/Int-argument constructor/factory"

Jackson fails with "Cannot construct instance of WorkpoolId (although at least one Creator exists): no int/Int-argument constructor/factory"

我有以下class

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

为此class我得到一个

javax.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of WorkpoolId (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (1)

为什么 jackson 不能对数值使用 long 构造函数?

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

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

现在 Data 中的 JsonCreator 在构造其字段 workpoolId.

时可以使用 workbookId

为了澄清这一点,这里有一个可能的例子 Data class:

@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 注释。