开发者社区> 问答> 正文

如何用Jackson定义2级继承结构

我具有以下基本(接口)结构

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        property = "messageType",
        visible = true)
@JsonSubTypes({
        @JsonSubTypes.Type(value = AppMessage.class, name = "APP"),   
        @JsonSubTypes.Type(value = NotificationMessage.class, name = "NOTIFICATION"),
})
public interface Message {
    MessageType getMessageType();

    Date getTimestamp();
}

该AppMessage班是一个简单的POJO(现在)像

public class AppMessage implements Message {

    private String appId; 
    ...
    private Date timestamp = Date.from(Instant.now());

}

但是NotificationMessage另一个界面

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        property = "NotificationType",
        visible = true)
@JsonSubTypes({
        @JsonSubTypes.Type(value = NotificationAckMessage.class, name = "ACK"),
        @JsonSubTypes.Type(value = NotificationReqMessage.class, name = "REQ"),
})
public interface NotificationMessage extends Message {

    String getDest();
    String getMessage();
    MessageType getMessageType();
    NotificationType getNotificationType();
}

当然还有两个实现的pojo NotificationAckMessage和NotificationReqMessage类NotificationMessage。

当过我要反序列化NotificationMessage像

{"NotificationType": "REQ", "dest": "some dest", "message": "some message", "messageType": "NOTIFICATION", "notificationType": "REQ", "timestamp": 1584299876847}

ObjectMapper objectMapper = new ObjectMapper();
Message msg = objectMapper.readValue(msgStr, Message.class);

我懂了

无法构造NotificationMessage实例:抽象类型需要映射到具体类型,具有自定义反序列化器或包含其他类型信息

当然,AppMessage解析过程没有任何错误。

如何在不展平它的情况下实现这种结构和逻辑,即在Message注释级别定义所有子类型?

谢谢!

问题来源:Stack Overflow

展开
收起
montos 2020-03-23 19:17:26 666 0
1 条回答
写回答
取消 提交回答
  • 似乎不支持此功能。看看这个问题:https : //github.com/FasterXML/jackson-databind/issues/374

    最后的答案:

    不支持它,也没有计划支持它。假设将要实现,请不要设计您的系统。

    回答来源:Stack Overflow

    2020-03-23 19:17:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
编程语言如何演化—— 以 JS 的 private 为例 立即下载
编程语言如何演化-以JS的private为例 立即下载