Jackson的@JsonIgnoreProperties与FAIL_ON_UNKNOWN_PROPERTIES对非字符串字段失效如何解决
问题根因
你遇到的报错本质上和「未知字段忽略规则」无关,错误信息已经明确是类型不匹配:Jackson反序列化时已经匹配到了目标类中同名字段,但是JSON中该字段是Object结构,目标类中对应字段类型为java.lang.String,类型不匹配才抛出异常。
你之前误以为目标类没有定义该字段,大概率是漏查了目标类继承的父类、实现的接口中定义的companyAddress字段。
修复方案
优先排查类定义
- 检查反序列化目标类的所有层级(自身、父类、实现的接口)中是否存在
companyAddress字段:- 如果存在且类型为
String,直接删除该字段,或者将字段类型改为Map<String,String>/自定义的地址实体类即可解决报错。 - 如果该字段是业务需要保留的
String类型,可以添加@JsonIgnore注解标注该字段,反序列化时直接忽略。
- 如果存在且类型为
- 确认你使用的
ObjectMapper实例确实配置了mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);,避免多个实例导致配置不生效的问题。
配置忽略类型不匹配异常
如果确认目标类全层级都没有定义companyAddress字段,还是抛出该异常,可以添加如下配置关闭类型不匹配的失败校验:
全局配置方式
ObjectMapper mapper = new ObjectMapper(); // 原有忽略未知字段配置 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 新增配置:遇到类型不匹配时直接忽略,不抛出异常 mapper.disable(DeserializationFeature.FAIL_ON_MISMATCHED_INPUT_TYPE); mapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
单类注解配置方式
如果不想全局生效,只需要在目标类上添加如下注解即可:
// ignoreInvalid参数表示忽略类型不匹配的属性 @JsonIgnoreProperties(ignoreUnknown = true, ignoreInvalid = true) public class YourTargetClass { // 类原有业务字段 }
注:ignoreInvalid参数需要Jackson 2.12及以上版本支持,低版本请使用全局配置方式
内容的提问来源于stack exchange,提问作者Harish
相关产品推荐
相关产品推荐

