Jackson ObjectMapper映射POJO的Double字段时将Integer值转为null问题咨询
问题根源
你遇到的问题核心是Jackson的setter匹配逻辑导致的:你重载了两个setFrequency方法,分别接收Double和Integer类型参数,Jackson反序列化时遇到传入的Integer类型值,会优先匹配参数类型为Integer的setter,但你给这个方法加了@JsonIgnore注解,Jackson就会跳过这个方法,同时不会主动做类型转换调用接收Double的setter,最终导致frequency字段没有被赋值,返回null。
可落地解决方案
方案1:移除Integer参数setter上的@JsonIgnore注解
这是最简便的方案,你本身定义这个重载方法就是为了处理Integer入参的场景,移除注解后Jackson会直接调用该方法,执行你已有的转换逻辑,就能正常赋值。
修改后代码:
/** * @param frequency the frequency to set */ // 去掉@JsonIgnore注解即可 public void setFrequency(Integer frequency) { if(frequency != null) { setFrequency(new Double(frequency)); } }
方案2:指定Double参数的setter为Jackson专用
如果你不想暴露Integer参数的setter,需要保留@JsonIgnore,可以给接收Double的setter加上@JsonSetter注解,强制Jackson只使用这个setter,同时配置ObjectMapper开启整数转浮点数的特性:
- 修改POJO代码:
public class TestModelWithDoubleField { private Double frequency; public Double getFrequency(){ return frequency; } /** * @param frequency the frequency to set */ @JsonSetter public void setFrequency(Double frequency) { this.frequency = frequency; } /** * @param frequency the frequency to set */ @JsonIgnore public void setFrequency(Integer frequency) { if(frequency != null) { setFrequency(new Double(frequency)); } } }
- 初始化ObjectMapper时添加配置:
objectMapper.configure(DeserializationFeature.ACCEPT_INTEGER_AS_FLOATING_POINT_NUMBER, true);
方案3:让Jackson直接操作字段赋值
如果不需要走setter逻辑,可以给字段加@JsonProperty注解,Jackson会通过反射直接给字段赋值,自动完成Integer到Double的类型转换:
public class TestModelWithDoubleField { @JsonProperty private Double frequency; // 其余原有代码保持不变即可 }
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

