嵌套JSON反序列化问题:无法实例化DeviceActionList类
问题解决步骤
1. 补充无参构造函数
你的类通过@Builder和@AllArgsConstructor生成了全参构造,但Jackson反序列化需要无参构造来创建实例。给以下类添加对应注解:
DeviceActionList类:
@Data @Builder @AllArgsConstructor @NoArgsConstructor // 新增无参构造注解 public class DeviceActionList { List<DeviceAction> actions; }
DeviceAction类:因包含@NonNull字段,需用force=true强制生成无参构造:
@Data @Builder @AllArgsConstructor @NoArgsConstructor(force = true) // 新增,处理NonNull字段初始化问题 public class DeviceAction { @NonNull private ActionName actionName; private ActionAttributes actionAttributes; }
LoginActionAttributes和PerformActionAttributes类同样补充:
@EqualsAndHashCode(callSuper = true) @Data @Builder @AllArgsConstructor @NoArgsConstructor(force = true) // 新增 public class LoginActionAttributes extends ActionAttributes { @NonNull private String emailId; @NonNull private String password; }
@EqualsAndHashCode(callSuper = true) @Data @Builder @AllArgsConstructor @NoArgsConstructor(force = true) // 新增 public class PerformActionAttributes extends ActionAttributes { @NonNull private String contentId; @NonNull private String contentType; }
2. 配置多态反序列化规则
ActionAttributes作为父类,JSON中的actionAttributes实际是其子类实例,需要告诉Jackson如何根据actionName匹配对应子类。在ActionAttributes类上添加Jackson多态注解:
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "actionName" // 用同级的actionName字段值判断子类类型 ) @JsonSubTypes({ @JsonSubTypes.Type(value = LoginActionAttributes.class, name = "LOGIN"), @JsonSubTypes.Type(value = PerformActionAttributes.class, name = "PERFORM") }) public class ActionAttributes { }
该配置逻辑:通过同级的actionName字段值,将LOGIN映射到LoginActionAttributes,PERFORM映射到PerformActionAttributes。
3. 验证反序列化
此时执行objectMapper.readValue(testInputString, DeviceActionList.class)即可完成正常反序列化。
内容的提问来源于stack exchange,提问作者Prakhar
相关产品推荐
相关产品推荐

