вызов мастер-класса как типа в JsonSubTypes - PullRequest
0 голосов
/ 25 октября 2019

Есть ли способ вызвать тот же класс, что и тип, используя аннотацию Джексона @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

}

1 Ответ

1 голос
/ 25 октября 2019

Попробуйте это

@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" ) } )
public class Master {

    public String name;
}
if ( master instanceof FirstClass){
...
} else if ( master instanceof SecondClass) {
...
} else if ( master instanceof ThirdClass){
...
} else if ( master instanceof Master ){
...
}

и используйте этот запрос для вызова основного условия

{
    "name":"test",
    "type":"Master"
}

РЕДАКТИРОВАТЬ: Вы можете использовать @JsonTypeName для конкретного имени

@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" ) } )
@JsonTypeName("forth")
public class Master {

    public String name;
}

запрос

{
    "name":"test",
    "type":"forth"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...