如何将JSON对象映射到子类实体?JSONB反序列化Dog时Eyes为空
问题排查与解决方案
针对你遇到的JSONB反序列化后Dog实例中eyes字段为null的问题,从以下几个方向排查:
1. 检查Animal类中Eyes字段的访问配置
JSONB默认依赖字段的getter/setter方法或者字段可见性完成反序列化:
- 如果
Animal中的eyes字段是private修饰,必须提供对应的public Eyes getEyes()和public void setEyes(Eyes eyes)方法; - 或者直接给
eyes字段添加@JsonbProperty注解,强制JSONB识别该字段,示例:public abstract class Animal { @JsonbProperty private Eyes eyes; private String name; // 省略getter/setter或添加无参构造 }
2. 确认JSONB对继承关系的处理
JSONB处理抽象类的子类时,需要明确类型识别规则:
- 在抽象类
Animal上添加@JsonbTypeInfo注解,指定类型标识字段;在Dog子类上添加@JsonbTypeName标注类型值:
此时请求JSON需要携带类型标识字段:@JsonbTypeInfo(use = JsonbTypeInfo.Id.NAME, include = JsonbTypeInfo.As.PROPERTY, property = "animalType") public abstract class Animal { private Eyes eyes; private String name; // 省略构造、getter/setter } @JsonbTypeName("dog") public class Dog extends Animal { // 子类特有属性或空实现 }{ "animalType": "dog", "name": "旺财", "eyes": { "color": "black", "pupilSize": "normal" } } - 如果接口直接声明接收
Dog类型(而非Animal),确保接口参数注解正确(比如JAX-RS中使用@Consumes(MediaType.APPLICATION_JSON),Spring中用@RequestBody),避免框架将参数按抽象类Animal处理。
3. 检查Eyes类的反序列化基础条件
JSONB反序列化对象必须满足:
Eyes类存在无参构造函数(默认隐式存在,若手动添加了带参构造,需显式声明无参构造);Eyes类的字段同样要有正确的getter/setter或@JsonbProperty注解,确保内部字段能被正常解析。
4. 验证JSON请求体格式
确保请求体中eyes是嵌套对象结构,字段名与实体类完全一致(JSONB默认大小写敏感):
错误示例(eyes为字符串):
{ "name": "旺财", "eyes": "brown" }正确示例:
{ "name": "旺财", "eyes": { "color": "brown", "isDoubleEyelid": true } }
内容的提问来源于stack exchange,提问作者Displayname
相关产品推荐
相关产品推荐

