Джексон, как определить тип по умолчанию для интерфейса поля? - PullRequest
0 голосов
/ 14 февраля 2020

Мне нужно десериализовать класс JSON в класс Java с полем Serializable. В следующем Java классе поле value является интерфейсом, идея заключается в том, что представление может отправлять значения типов: String, Double, Long и ArrayList. Если я изменю тип поля значения с Serializable на Object, он будет работать, как и ожидалось.

public class UpdateAttribute implements Serializable {
    //..
    // There is something like: @JsonImplType(Object.class)
    private Serializable value;
}

У меня вопрос, есть такой способ определить тип класса по умолчанию для поля значения ? Что-то вроде: @JsonImplType(Object.class)?

1 Ответ

0 голосов
/ 14 февраля 2020

Решением этой проблемы является использование аннотации из модуля jackson-databind. Здесь был задан похожий вопрос: Джексон - Как указать единственную реализацию для десериализации с привязкой к интерфейсу? .

public class UpdateAttribute implements Serializable {
    //..
    @JsonDeserialize(as = Object.class)
    private Serializable value;
}

Однако следует рассмотреть одну деталь. Метод setValue для UpdateAttribute не может быть объявлен с аргументом Serializable. Потому что Джексон не знает о кастинге с Object до Serializable. Поэтому итоговый класс должен выглядеть так:

public class UpdateAttribute implements Serializable {

    @JsonDeserialize(as = Object.class)
    private Serializable value;

    public void setValue(Object value) {
        this.value = (Serializable) value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...