我具有以下基本(接口)结构
@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
似乎不支持此功能。看看这个问题:https : //github.com/FasterXML/jackson-databind/issues/374
最后的答案:
不支持它,也没有计划支持它。假设将要实现,请不要设计您的系统。
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。