Проблема маппинга объектов на модель во время десериализации

Коллеги, добрый день! Наткнулся на проблему маппинга объектов во время десериализации. У нас имеется интерфейс Source, который реализуют 2 класса (SimpleSource и ComplexSource). Экземпляры этих классов содержатся в списках в отдельном объекте SourceContainer. В JSON хранится конфигурация SourceContainer, которую мы хотим десериализовать. Ошибка такова:

com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class org.example.SimpleSource]: missing type id property 'jacksonType' (for POJO property 'simpleSources')
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 5, column: 5] (through reference chain: org.example.SourceContainer["simpleSources"]->java.util.ArrayList[0])

Для воспроизведения ошибки приведу максимально сжатый список всех классов моей программы

package org.example;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.io.InputStream;

public class Main {
    public static void main(String[] args) {
        // Путь к JSON-файлу
        InputStream jsonFile = Main.class.getClassLoader().getResourceAsStream("sourceContainer.json");

        // Создание ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        try {
            // Десериализация JSON из файла в объект SourceContainer
            SourceContainer sourceContainer = objectMapper.readValue(jsonFile, SourceContainer.class);

            // Печать всех источников
            sourceContainer.printAllSources();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

package org.example;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "jacksonType"
)
@JsonSubTypes({
        @JsonSubTypes.Type(value = SimpleSource.class, name = "simpleSource"),
        @JsonSubTypes.Type(value = ComplexSource.class, name = "complexSource")
})
public interface Source {
    String getDescription();
}
package org.example;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class SimpleSource implements Source {

    private String description;

    public SimpleSource(String description) {
        this.description = description;
    }

    @Override
    public String getDescription() {
        return "Simple Source: " + description;
    }
}
package org.example;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class ComplexSource implements Source {

    private String description;
    private String details;

    public ComplexSource(String description, String details) {
        this.description = description;
        this.details = details;
    }

    @Override
    public String getDescription() {
        return "Complex Source: " + description + " - " + details;
    }
}
package org.example;

import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
public class SourceContainer {

    private List<SimpleSource> simpleSources;
    private List<ComplexSource> complexSources;

    public SourceContainer() {
        this.simpleSources = new ArrayList<>();
        this.complexSources = new ArrayList<>();
    }

    // Добавление SimpleSource
    public void addSimpleSource(SimpleSource source) {
        simpleSources.add(source);
    }

    // Добавление ComplexSource
    public void addComplexSource(ComplexSource source) {
        complexSources.add(source);
    }

    // Печать всех источников
    public void printAllSources() {
        System.out.println("Simple Sources:");
        for (SimpleSource source : simpleSources) {
            System.out.println(source.getDescription());
        }

        System.out.println("Complex Sources:");
        for (ComplexSource source : complexSources) {
            System.out.println(source.getDescription());
        }
    }
}

{
  "simpleSources": [
    {
      "description": "Basic Data Source 1"
    },
    {
      "description": "Basic Data Source 2"
    }
  ],
  "complexSources": [
    {
      "description": "Advanced Data Source 1",
      "details": "Includes extensive metadata"
    },
    {
      "description": "Advanced Data Source 2",
      "details": "Contains additional analytics"
    }
  ]
}

Ответы (1 шт):

Автор решения: talex moved to Codidact

Нужно удалить аннотации @JsonTypeInfo и @JsonSubTypes.

→ Ссылка