繁体   English   中英

Jackson 无法使用枚举字段反序列化不可变的 object

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

当反序列化为不可变的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM