Spring Boot如何从POST接口返回自定义对象并解决反序列化报错
问题根因
Spring Boot默认使用Jackson完成JSON和Java对象的互转:
- 序列化(Java对象转JSON)仅要求类提供对应属性的getter方法,所以你之前发送Auction对象、服务端返回Bid对象序列化的过程都正常
- 反序列化(JSON转Java对象)要求类提供可被Jackson识别的实例化入口,要么是公共无参构造+对应属性的setter,要么是显式标注的有参构造
你当前的Bid类仅提供了自定义带参构造,既没有无参构造和setter,也没有标注带参构造为反序列化入口,所以调用方收到JSON要转Bid对象时无法实例化,抛出报错。而你之前Auction类中的Bid类型winner字段未赋值,序列化时不会输出对应字段,反序列化时也不需要构造Bid实例,所以不会暴露这个问题。
解决方案
以下三种方案任选其一即可解决问题:
方案1:添加无参构造+setter(最简单通用)
修改Bid类补充无参构造和属性setter:
class Bid{ private URI host; // 新增公共无参构造 public Bid(){} public Bid(URI host){ this.host = host; } public URI getHost() { return host; } // 新增host属性的setter方法 public void setHost(URI host) { this.host = host; } }
如果项目引入了Lombok,直接给Bid类加@Data或者@NoArgsConstructor + @AllArgsConstructor注解即可,无需手动编写构造方法和get/set方法。
方案2:标注有参构造为Jackson反序列化入口(保持类不可变性)
如果不想破坏Bid类的不可变性,不需要新增无参构造和setter,可以用Jackson注解指定反序列化使用的构造器:
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; class Bid{ private URI host; @JsonCreator // 标记该构造器为Jackson反序列化专用 public Bid(@JsonProperty("host") URI host){ this.host = host; } public URI getHost() { return host; } }
方案3:使用JDK原生注解标注构造器(无Jackson依赖)
如果模型类是公共模块,不想引入Jackson相关依赖,可以用JDK自带的ConstructorProperties注解:
import java.beans.ConstructorProperties; class Bid{ private URI host; @ConstructorProperties({"host"}) // 注解内的参数名要和JSON字段名一一对应 public Bid(URI host){ this.host = host; } public URI getHost() { return host; } }
内容的提问来源于stack exchange,提问作者Gustavo Vilas Boas
相关产品推荐
相关产品推荐

