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

Jackson反序列化报错无法从字符串构造实例 不改枚举如何处理

问题根因

报错是因为Jackson反序列化Ticket对象时,发现setRevisionStatus存在两个重载方法,会优先匹配参数为RevisionStatus枚举的方法处理JSON传入的字符串值。但你传入的"New"、"Modified"、"abc"等值都不是RevisionStatus枚举定义的added、updated枚举项,因此在解析payload阶段就直接失败,无法进入控制器逻辑。

解决方案(无需修改枚举代码)

最简洁的处理方式是明确告诉Jackson反序列化时不要使用枚举参数的setter,仅使用String参数的setter处理传入值:

  1. 在Ticket类的枚举参数setter上添加@JsonIgnore注解即可,修改后的代码如下:
public class Ticket implements Serializable{

  @JsonProperty("lineItemStatus")
  private String revisionStatus;
  public String getRevisionStatus() {
    return revisionStatus;
  }
  
  public void setRevisionStatus(String revisionStatus) {
    this.revisionStatus = revisionStatus; 
  }

  // 新增@JsonIgnore注解,避免Jackson反序列化时调用该方法
  @JsonIgnore
  public void setRevisionStatus(RevisionStatus revisionStatus) {
    String status = "";
    if (revisionStatus != null) {
      switch (revisionStatus) {
      case added: {
        status = "New";
        break;
      }
      case updated: {
        status = "Modified";
        break;
      }
      }
    }
    this.revisionStatus = status;
  }
}

改动说明

  • @JsonIgnore仅会阻止Jackson自动调用这个枚举参数的setter,不会影响你业务代码中手动调用该方法,原有GET接口的逻辑完全不受影响
  • 反序列化时Jackson会自动调用String参数的setter,支持传入任意字符串值,完全符合你PUT接口的需求

如果不想修改POJO类的注解,也可以全局配置Jackson的反序列化规则,自定义RevisionStatus类型的反序列化逻辑,遇到未匹配的枚举值时直接返回null即可,但相比之下第一种方案更简洁易维护。

内容的提问来源于stack exchange,提问作者Santosh Kamat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:36:05