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

sha*_*haf 3 java json 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();
}
Run Code Online (Sandbox Code Playgroud)

该类AppMessage是一个简单的 POJO(目前),例如

public class AppMessage implements Message {

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

}
Run Code Online (Sandbox Code Playgroud)

但这NotificationMessage是另一个界面

public class AppMessage implements Message {

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

}
Run Code Online (Sandbox Code Playgroud)

当然还有另外两个实现 的pojo asNotificationAckMessage和类。NotificationReqMessageNotificationMessage

每当我想要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();
}
Run Code Online (Sandbox Code Playgroud)

我明白了

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

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

如何实现这种结构和逻辑而不扁平化它,即在Message注释级别定义所有子类型?

谢谢!

Ily*_*nko 5

这个好像是不支持的。看这个问题:https ://github.com/FasterXML/jackson-databind/issues/374

最后的回答:

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