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

Spring Boot中Jackson反序列化:能否实例化父类User?

解决方案:Jackson反序列化实例化通用User类

你的问题核心在于当前的Jackson类型识别配置只覆盖了Student和Supervisor子类,未对父类User本身做映射,也没指定默认实现类,导致无法直接反序列化为User。可以通过以下修改实现需求:

修改User类的Jackson注解

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "role",
    visible = false,
    defaultImpl = User.class // 新增:指定无法匹配子类时的默认实现
)
@JsonSubTypes({
    @JsonSubTypes.Type(value = Student.class, name = "STUDENT"),
    @JsonSubTypes.Type(value = Supervisor.class, name = "SUPERVISOR"),
    @JsonSubTypes.Type(value = User.class, name = "USER") // 新增:为User本身添加类型映射
})
public class User {
    // 原有属性与方法
}

配置说明

  • defaultImpl = User.class:当传入的JSON中没有role字段,或者role值不在STUDENT/SUPERVISOR范围内时,Jackson会自动实例化通用的User类,正好匹配你"先创建通用用户、后续再确定具体类型"的业务场景。
  • 添加@JsonSubTypes.Type(value = User.class, name = "USER"):如果后续需要主动通过role: "USER"标识来反序列化为User,该配置也能生效。

测试场景验证

  1. 无role字段的JSON:
    {"email": "temp@example.com", "username": "temp_user"}
    
    会被反序列化为User实例。
  2. 带role: "USER"的JSON:
    {"role": "USER", "email": "temp@example.com", "username": "temp_user"}
    
    同样会被反序列化为User实例。

内容的提问来源于stack exchange,提问作者fipps omat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:27:26