Есть ли способ вызвать тот же класс, что и тип, используя аннотацию Джексона @JsonSubTypes
?
Вот объяснение:
Я создал этот мастер-класс, который имеет много подтипов
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type" )
@JsonSubTypes( { @Type( value = FirstClass.class, name = "first" )
,@Type( value = SecondClass.class, name = "second" )
,@Type( value = ThirdClass.class, name = "third" ) } )
@Data
public abstract class Master {
public String name;
}
для трех классов (FirstClass, SecondClass и ThirdClass) они содержат разные атрибуты, и в моем коде у меня есть 4 разных условия
if ( inputClass instanceof FirstClass){...}
else if ( inputClass instanceof SecondClass){...}
else if ( inputClass instanceof ThirdClass){...}
else if ( inputClass instanceof Master ){...}
Меня беспокоит последнее условие, когда inputClass имеет толькоАтрибуты name
и type
и никакие другие поля, как в остальных случаях , поэтому я попытался создать новый тип, добавив его в JsonSubTypes
@Type( value = Master.class, name = "fourth" )
И я изменил четвертое условиев это
if ( inputClass instanceof Master ){...}
Но когда я отправляю запрос на отдых, используя этот ввод
{
"name":"test",
"type":"fourth"
}
Я получаю эту ошибку:
Ошибка анализа JSON: Можетне создавать экземпляр com.test.Master, проблема: абстрактные типы должны либо отображаться на конкретные типы, иметь собственный десериализатор, либо создаваться с дополнительной информацией о типах;Вложенное исключение: com.fasterxml.jackson.databind.JsonMappingException: невозможно создать экземпляр com.test.Master
Похоже, мне потребуется создать класс без атрибутов, чтобы использовать его в качестве типа. вместо использования мастера, и я не знаю, есть ли лучшее решение
Вот пример для используемых классов (первый, второй и третий)
@Data
@EqualsAndHashCode( callSuper = true )
@JsonTypeName( "FirstClass" )
public class FirstClass extends Master {
public FirstClass() {
}
private String attributeA = null;
//attributeB for SecondClass and attributeC for ThirdClass
}