Как определить 2-уровневую структуру наследования с Джексоном - PullRequest
2 голосов
/ 15 марта 2020

У меня есть следующая базовая (интерфейсная) структура

@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 уровень?

Спасибо!

1 Ответ

2 голосов
/ 15 марта 2020

Похоже, это не поддерживается. Посмотрите на эту проблему: https://github.com/FasterXML/jackson-databind/issues/374

Последний ответ:

Он не поддерживается и нет планов его поддержки. Не проектируйте свою систему, предполагая, что это будет выполнено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...