SpringBoot对接Mongo时反序列化报错Cannot construct instance of City如何解决
问题原因
该报错是接口接收JSON参数时,Jackson反序列化框架无法实例化不可变类City导致,问题出在HTTP请求转Java对象的阶段,和MongoDB存储逻辑无关。
你的City类只有一个带name参数的构造器,Jackson默认无法识别构造参数和JSON字段的对应关系,因此无法完成实例化。
解决方案
以下任意一种方案均可解决问题:
方案1:给构造器添加参数映射注解
直接在City的构造器上添加@ConstructorProperties注解,指定构造参数对应的字段名:
import java.beans.ConstructorProperties; public class City { public final String name; @ConstructorProperties("name") public City(String name) { this.name = name; } // 原有toString方法保持不变 }
方案2:使用Jackson序列化注解标注构造器
用@JsonCreator和@JsonProperty明确告诉Jackson构造器的参数对应关系:
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; public class City { public final String name; @JsonCreator public City(@JsonProperty("name") String name) { this.name = name; } // 原有toString方法保持不变 }
方案3:使用Lombok简化不可变类定义
如果项目引入了Lombok,直接给City类添加@Value注解,Lombok会自动生成符合Jackson反序列化要求的结构,无需手动写构造、toString等方法:
import lombok.Value; @Value public class City { String name; }
额外注意事项
你Postman提交的JSON存在语法错误:imageId字段后多余逗号,且多了一层闭合大括号,修正后的正确格式如下:
{ "city": { "name": "Atena" }, "imageId": "Doe" }
请先修正JSON格式再测试,避免额外的解析错误。
内容的提问来源于stack exchange,提问作者user9347049
相关产品推荐
相关产品推荐

