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
,而是因为Lombok
和Jackson
在这种情况下不能一起工作。
当反序列化为不可变类时,我们需要用Jackson
注释显式地提到这一点。通常我们注释构造函数。但是在这种情况下,构造函数是由Lombok
创建的,Lombok
没有添加这些注释。
简单的修复方法是,删除@RequiredArgsConstructor
注释并自己创建构造函数。然后将构造函数注释为@JsonCreator
。像这样,
@Getter
public class PaymentRequest {
@JsonProperty(value = "paymentMethod")
private final PaymentMethod paymentMethod;
@JsonCreator
public PaymentRequest(PaymentMethod paymentMethod) {
this.paymentMethod = paymentMethod;
}
}