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

Spring Rest Controller如何返回父类类型中的具体子类实例?

Spring Rest Controller返回父类集合时如何包含子类特有属性?

你遇到的是Java对象JSON序列化的多态处理问题——Spring默认使用Jackson进行JSON序列化,当序列化父类集合时,Jackson默认只会序列化父类的属性,不会自动识别并序列化子类的特有属性。咱们可以通过给父类添加Jackson的多态注解来解决这个问题,具体步骤如下:

1. 给父类A添加Jackson多态注解

在父类A上添加@JsonTypeInfo和@JsonSubTypes注解,用来告诉Jackson如何识别和序列化子类对象:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type" // 自定义类型标识字段名,可根据需求修改
)
@JsonSubTypes({
    @JsonSubTypes.Type(value = B.class, name = "B"),
    @JsonSubTypes.Type(value = C.class, name = "C")
})
class A { 
    private int id; 
    // get/set方法
}

class B extends A { 
    private String attributeB; 
    // get/set方法
}

class C extends A { 
    private String attributeC; 
    // get/set方法
}

2. 注解作用说明

  • @JsonTypeInfo:定义类型信息的处理规则
    • use = JsonTypeInfo.Id.NAME:用我们指定的名称作为子类的类型标识
    • include = JsonTypeInfo.As.PROPERTY:把类型标识作为一个普通属性嵌入JSON中
    • property = "type":指定类型标识的字段名称,比如改成"classType"也可以
  • @JsonSubTypes:枚举所有需要被识别的子类,每个@Type绑定子类的Class和对应的类型标识名

3. 验证效果

修改完成后,调用/api/a接口,返回的JSON会变成:

[
    { "id": 1, "type": "A" },
    { "id": 2, "type": "B", "attributeB": "B" },
    { "id": 3, "type": "C", "attributeC": "C" }
]

如果你不想在JSON中显示type标识字段,也可以调整@JsonTypeInfo的include参数(比如As.EXTERNAL_PROPERTY),不过显式添加类型字段是最常用的方案,既清晰又方便后续的反序列化操作。

另外要确保你的aDao.list()确实返回了B和C的实例(而非被强制转为A的实例),这点你的现有代码已经满足,无需修改DAO层逻辑。

内容的提问来源于stack exchange,提问作者fredy hernan sanchez montaa Ha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:16:14