JsonTypeInfo для одного конкретного подклассаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JsonTypeInfo для одного конкретного подкласса

Сообщение Anonymous »

Код

Код: Выделить всё

package org.example;

public class Container {
private Base base;
public void setBase(Base newBase) {
base = newBase;
}
public String getName() {
return base.getName();
}
}
=========
package org.example;

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

@JsonTypeInfo(defaultImpl = Sub1.class, use = Id.NONE)
public abstract class Base {
public abstract String getName();
}
=========
package org.example;

public class Sub1 extends Base {
private String name;
@Override
public String getName() {
return name;
}
}
=============
package org.example;

public class Sub2 extends Base {
private String title;
public Sub2(String newTitle) {
title = newTitle;
}
@Override
public String getName() {
return title;
}
}
Цель такова: когда экземпляр Container десериализуется из JSON, база участников всегда является экземпляром Sub1. setBase() можно вызвать для изменения значения base (также на экземпляр Sub2).
Однако следующий код завершается с ошибкой при втором вызове objectMapper.readValue()

Код: Выделить всё

package org.example;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
public static void main(String[] args) throws JsonProcessingException {
Container container = new Container();
container.setBase(new Sub2("bb"));

System.out.println(container.getName());
ObjectMapper objectMapper = new ObjectMapper();
Sub1 sub1 = objectMapper.readValue("""
{"name":"cc"}
""", Sub1.class);
container.setBase(sub1);
System.out.println(container.getName());
container = objectMapper.readValue(
"""
{
"base":{
"name":"aa"
}
}
""", Container.class);
}
}
Исключением является

Невозможно создать экземпляр org.example.Base

и я не понимаю, почему аннотации @JsonTypeInfo недостаточно, чтобы поручить Джексону создать экземпляр Sub1.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... c-subclass
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»