Jackson无法反序列化带有enum字段的不可变对象



Spring Boot 2.5.4 with Jackson 2.12.4

给定下面的简化enum…

@AllArgsConstructor
@Getter
public enum PaymentMethod {
CREDITCARD(1);
private long id;
}

…和一个请求对象,它将使用Jackson:

进行反序列化。
@NoArgsConstructor
@Getter
@Setter
public class PaymentRequest {
@JsonProperty(value = "paymentMethod")
private PaymentMethod paymentMethod;
}

这很好。现在,我想让请求对象不可变,所以我把它改成这样:

@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,而是因为LombokJackson在这种情况下不能一起工作。

当反序列化为不可变类时,我们需要用Jackson注释显式地提到这一点。通常我们注释构造函数。但是在这种情况下,构造函数是由Lombok创建的,Lombok没有添加这些注释。

简单的修复方法是,删除@RequiredArgsConstructor注释并自己创建构造函数。然后将构造函数注释为@JsonCreator。像这样,

@Getter
public class PaymentRequest {
@JsonProperty(value = "paymentMethod")
private final PaymentMethod paymentMethod;
@JsonCreator
public PaymentRequest(PaymentMethod paymentMethod) {
this.paymentMethod = paymentMethod;
}
}