杰克逊失败 "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
注释。
我有以下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.
为了澄清这一点,这里有一个可能的例子 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
注释。