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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:06:06