簡體   English   中英

如何用 Jackson 定義 2 級繼承結構

[英]How to define 2-level inheritance structure with Jackson

我有以下基本(接口)結構

@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();
}

當然還有兩個 pojos 作為實現NotificationMessage NotificationAckMessageNotificationReqMessage類。

當我想反序列化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注釋級別定義所有子類型?

謝謝!

好像不支持這個。 看這個問題: https : //github.com/FasterXML/jackson-databind/issues/374

最后一個答案:

它不受支持,也沒有計划支持它。 不要假設會實現這一點來設計您的系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM