Проблема маппинга объектов на модель во время десериализации
Коллеги, добрый день! Наткнулся на проблему маппинга объектов во время десериализации.
У нас имеется интерфейс 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
.