Spring Boot继承模型JSON序列化:父子类重复字段处理咨询
解决方案:序列化Person时仅保留父类
pets字段并包含子类数据 完全可行,以下是具体实现步骤:
配置Jackson多态序列化规则
默认情况下Jackson可能会为子类生成额外字段,你需要在父类Pet上添加Jackson的多态注解,明确子类与父类的映射关系,让Jackson将所有子类实例统一序列化为父类Pet的形式,避免拆分出cats这类子类专属字段。修改后的
Pet类代码:@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @JsonSubTypes.Type(value = Cat.class, name = "cat") }) public abstract class Pet { @JsonIgnore @ManyToMany @JoinTable(name = "person_pets", joinColumns = @JoinColumn(name = "pet_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id")) private Set<Person> owners; // 此处添加getter、setter方法 }注解说明:
@JsonTypeInfo:指定序列化时添加类型标识字段(这里是type),用来区分不同子类@JsonSubTypes:声明父类对应的所有子类,让Jackson能正确识别并统一处理
确保JPA查询加载父类集合
查询Person时,保持默认的关联查询逻辑即可,JPA的TABLE_PER_CLASS继承策略会自动将所有Pet子类(比如Cat)的数据加载到pets集合中,无需额外修改查询语句,避免刻意查询子类导致生成额外字段。可选:强制排除冗余字段
如果配置后仍出现cats字段,可以在Person类上添加@JsonIgnoreProperties注解强制忽略该字段:@Entity @Table(name="people") @JsonIgnoreProperties({"cats"}) public class Person { @ManyToMany(mappedBy = "owners") private Set<Pet> pets; // 此处添加getter、setter方法 }
完成上述配置后,序列化Person对象时,响应中只会保留pets字段,且该字段会包含所有Cat子类的实例数据,同时通过type字段区分不同宠物类型(可根据需求调整@JsonTypeInfo的配置去掉类型字段)。
内容的提问来源于stack exchange,提问作者JosephCHW
相关产品推荐
相关产品推荐

