[英]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
NotificationAckMessage
和NotificationReqMessage
类。
当我想反序列化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.