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

SpringBoot中Jackson解析缺失字段JSON时实例化失败求助

问题分析

你遇到的HttpMessageNotReadableException是因为Jackson在解析缺失字段的JSON时,实例化BenzenoidCriterions的过程出现异常。核心原因:

  • 你同时定义了无参构造和全参构造,Jackson未明确配置时会优先尝试调用全参构造;
  • JSON缺失字段时,对应构造参数会传入null,加上Java编译默认不保留参数名,Jackson无法正确匹配字段与构造参数,最终触发NullPointerException;
  • 实体类缺少setter方法,Jackson无法通过无参构造创建实例后注入字段值,缺失字段无法保留默认空字符串。
解决方案

方案1:补充Setter方法并指定Jackson行为

  1. 为BenzenoidCriterions所有字段添加setter方法,让Jackson能通过无参构造创建实例后,为存在的字段赋值:
public class BenzenoidCriterions {
    
    private String id = "";
    private String name = "";
    private String nbHexagons = "";
    private String nbCarbons = "";
    private String nbHydrogens = "";
    private String irregularity = "";
    
    public BenzenoidCriterions() {
        super();
    }
    
    public BenzenoidCriterions(String id, String name, String nbHexagons,
            String nbCarbons, String nbHydrogens, String irregularity) {
        this.id = id;
        this.name = name;
        this.nbHexagons = nbHexagons;
        this.nbCarbons = nbCarbons;
        this.nbHydrogens = nbHydrogens;
        this.irregularity = irregularity;
    }

    // 原有getter方法
    
    // 添加setter方法
    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setNbHexagons(String nbHexagons) {
        this.nbHexagons = nbHexagons;
    }

    public void setNbCarbons(String nbCarbons) {
        this.nbCarbons = nbCarbons;
    }

    public void setNbHydrogens(String nbHydrogens) {
        this.nbHydrogens = nbHydrogens;
    }

    public void setIrregularity(String irregularity) {
        this.irregularity = irregularity;
    }
}
  1. 在实体类上添加@JsonIgnoreProperties(ignoreUnknown = true)注解,允许Jackson忽略未知字段,同时确保无参构造被优先使用:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class BenzenoidCriterions {
    // ... 原有代码
}

方案2:用Lombok简化实体类配置(推荐)

如果项目已引入Lombok,可通过注解自动生成所需方法和构造函数,避免手动编写的繁琐:

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BenzenoidCriterions {
    private String id = "";
    private String name = "";
    private String nbHexagons = "";
    private String nbCarbons = "";
    private String nbHydrogens = "";
    private String irregularity = "";
}
  • @Data:自动生成getter、setter、toString等方法;
  • @NoArgsConstructor:生成无参构造,确保Jackson能实例化对象;
  • @AllArgsConstructor:生成全参构造(按需保留);
  • @JsonIgnoreProperties:忽略未知字段,增强兼容性。

方案3:全局配置Jackson行为

不想修改实体类的话,可通过SpringBoot全局配置让Jackson优先使用无参构造,并允许缺失构造参数:
在application.properties中添加以下配置:

# 允许构造函数参数缺失时不报错
spring.jackson.deserialization.fail-on-missing-creator-properties=false
# 优先使用无参构造实例化对象
spring.jackson.deserialization.use-property-based-deserialization=true

内容的提问来源于stack exchange,提问作者Adrien Varet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:50:27