У меня есть следующая базовая (интерфейсная) структура
@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 как 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
анализируется без каких-либо ошибок.
Как мне добиться такой структуры и логики c без ее выравнивания, т.е. определить все подтипы в аннотации Message
уровень?
Спасибо!