Spring Boot @RequestBody映射Cab子类报JSON构造实例错误解决
报错原因
Spring Boot默认使用Jackson完成JSON到Java对象的反序列化,该过程默认需要目标类提供无参构造方法。
你在Cab类中自定义了带3个参数的构造方法后,Java不会再自动生成默认的无参构造方法,Jackson找不到可用的无参构造来实例化Cab对象,就会抛出该构造失败的错误。如果父类Vehicle也只定义了有参构造、未提供无参构造,同样会触发子类实例化失败。
修复方案
任选以下一种方案配置即可:
方案1:手动补全无参构造
直接在Cab类(以及父类Vehicle,如果父类也没有无参构造的话)中添加无参构造方法:public Cab() { }原有带参构造、类属性的getter/setter方法保留即可,不需要修改其他逻辑,注意要保证类中所有需要从JSON映射的属性都提供了对应的public getter/setter方法,否则会出现字段赋值为null的问题。这是日常开发中最常用、改造成本最低的修复方式。
方案2:通过注解绑定带参构造
如果你不想额外添加无参构造,可以给已有的带参构造添加Jackson注解,明确告诉Jackson用这个构造方法实例化对象、每个参数对应JSON里的哪个字段:import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; // 在你的Cab类原有构造方法上加注解 @JsonCreator public Cab( @JsonProperty("licensePlate") String licensePlate, @JsonProperty("basePricePerKm") double basePricePerKm, @JsonProperty("horsePower") double horsePower ) { // 原有构造方法内的赋值逻辑不需要改动 this.licensePlate = licensePlate; this.basePricePerKm = basePricePerKm; this.horsePower = horsePower; }方案3:使用Lombok自动生成构造方法
如果你的项目已经引入Lombok依赖,直接在Cab类(以及对应的父类)上添加注解,编译期Lombok会自动生成需要的构造方法和getter/setter,不需要手动编写:import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; import lombok.Data; @Data // 自动生成所有属性的getter/setter、toString等通用方法 @NoArgsConstructor // 自动生成无参构造 @AllArgsConstructor // 自动生成全属性的带参构造 public class Cab extends Vehicle { // 类内的属性、业务方法正常编写即可 private String licensePlate; private double basePricePerKm; private double horsePower; }
内容的提问来源于stack exchange,提问作者ManuelP
相关产品推荐
相关产品推荐

