Десериализация коллекции, которая наследует список - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь десериализовать такой интерфейс:

public interface MyCollection<T> extends List<T> {...}

И MyCollection имеет несколько реализаций, скажем public class MyBasicCollection<String> и public class MyOtherCollection<String>.

Я добавиланнотации на интерфейсе, например:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = MyBasicCollection.class, name = "basic"),
    @JsonSubTypes.Type(value = MyOtherCollection.class, name = "other")
})
public interface MyCollection<T> extends List<T> {...}

Подробный код для сериализации и десериализации будет выглядеть так:

MyCollection<String> testCollection = new MyBasicCollection<String>();
ObjectMapper mapper = new ObjectMapper();
String serializedString = mapper.writeValueAsString(testCollection);
MyCollection<String> reconstructed = mapper.readValue(serializedString, new TypeReference<MyCollection<String>>(){});

И я получу

Не удается найти десериализатор для не-бетона Тип коллекции

JsonMappingException.

Однако, если я изменю последнюю строку на

MyCollection<String> reconstructed = mapper.readValue(serializedString, new TypeReference<MyBasicCollection<String>>(){});

Она отлично работает.

Есть ли способ заставить десериализацию работать с полиморфным типом?

...