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

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开启整数转浮点数的特性:

  1. 修改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));
        }
    }
}
  1. 初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:36:03