You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.5.4中Jackson无法反序列化含枚举字段的不可变对象

问题结论

这不是Jackson反序列化枚举的固有局限,问题根源是调整后的不可变类没有提供Jackson可识别的实例化创建器,和枚举类型的反序列化逻辑无关。你即使把paymentMethod字段替换为普通的String、int等基础类型,按当前的不可变类写法也会抛出完全相同的错误。

错误原因
  • 原有可反序列化的PaymentRequest类提供了无参构造器+Setter方法:Jackson的默认反序列化逻辑是先调用无参构造器实例化对象,再通过Setter方法给字段赋值,因此可以正常运行。
  • 调整为不可变类后,仅提供了带参数的RequiredArgsConstructor构造器:Jackson默认无法识别该构造器的参数和JSON属性的对应关系,因此找不到可用的对象创建方式,抛出你遇到的报错。
修复方案

方案1:配置Lombok自动为构造器添加Jackson识别注解

在类的@RequiredArgsConstructor注解上添加配置,让Lombok生成的构造器带上@JsonCreator注解,告知Jackson该构造器用于反序列化:

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

方案2:全局开启Lombok构造器属性绑定配置

在项目根目录新增lombok.config配置文件,添加如下配置:

lombok.anyConstructor.addConstructorProperties = true

开启后Lombok生成的所有构造器都会自动带上java.beans.ConstructorProperties注解,Jackson可以自动识别构造器参数和JSON属性的对应关系,无需额外修改类注解。

方案3:手动编写反序列化构造器

如果不想依赖Lombok的配置,可以手动编写构造器并为参数绑定JsonProperty:

@Getter
public class PaymentRequest {
    private final PaymentMethod paymentMethod;

    public PaymentRequest(@JsonProperty("paymentMethod") PaymentMethod paymentMethod) {
        this.paymentMethod = paymentMethod;
    }
}

内容的提问来源于stack exchange,提问作者Robert Strauch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:15:02