Jackson反序列化报错无法从字符串构造实例 不改枚举如何处理
问题根因
报错是因为Jackson反序列化Ticket对象时,发现setRevisionStatus存在两个重载方法,会优先匹配参数为RevisionStatus枚举的方法处理JSON传入的字符串值。但你传入的"New"、"Modified"、"abc"等值都不是RevisionStatus枚举定义的added、updated枚举项,因此在解析payload阶段就直接失败,无法进入控制器逻辑。
解决方案(无需修改枚举代码)
最简洁的处理方式是明确告诉Jackson反序列化时不要使用枚举参数的setter,仅使用String参数的setter处理传入值:
- 在
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
相关产品推荐
相关产品推荐

