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
相关产品推荐
相关产品推荐

