[英]Jackson unable to deserialize immutable object with enum field
Spring 引导 2.5.4 与 Jackson 2.12.4
给定以下简化的枚举...
@AllArgsConstructor
@Getter
public enum PaymentMethod {
CREDITCARD(1);
private long id;
}
...和请求 object 应使用 Jackson 反序列化:
@NoArgsConstructor
@Getter
@Setter
public class PaymentRequest {
@JsonProperty(value = "paymentMethod")
private PaymentMethod paymentMethod;
}
这很好用。 现在,我想让请求 object 不可变,所以我将其更改为:
@RequiredArgsConstructor
@Getter
public class PaymentRequest {
@JsonProperty(value = "paymentMethod")
private final PaymentMethod paymentMethod;
}
但是这个变体失败了:
Cannot construct instance of 'PaymentRequest' (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
这是反序列化枚举时的一些 Jackson 限制吗?
这个问题不是因为参数是一个Enum
,而是因为Lombok
和Jackson
在这种情况下不能一起工作。
当反序列化为不可变的 class 时,我们需要使用Jackson
注释明确提及它。 通常我们注释构造函数。 但在这种情况下,构造函数是由Lombok
创建的,而Lombok
不添加这些注释。
简单的解决方法是,删除@RequiredArgsConstructor
注释并自己创建构造函数。 然后将构造函数注释为@JsonCreator
。 像这样的东西,
@Getter
public class PaymentRequest {
@JsonProperty(value = "paymentMethod")
private final PaymentMethod paymentMethod;
@JsonCreator
public PaymentRequest(PaymentMethod paymentMethod) {
this.paymentMethod = paymentMethod;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.