Spring Boot Jackson Databind - настройка наследования

Предположим, у меня есть базовый класс A:

public class A {
    public String a;
}

И два дочерних класса B и C:

public class B extends A {
    public String b;
}

public class C extends A {
    public String c;
}

И обертка класса A:

public class Wrapper {
    public A a;
}

И у меня есть контроллер Rest, который получает клиентские запросы как объект-оболочку:

@RestController
public class SomeController {

    public void foo(@RequestBody Wrapper wrapper) {}

}

Проблема в том, что Джексон приводит поле оболочки к базовому классу A.

Как я могу настроить его для получения правильного типа?


person ivanjermakov    schedule 25.05.2018    source источник
comment
github.com/FasterXML/jackson-docs/wiki/   -  person shmosel    schedule 25.05.2018
comment
@shmosel У меня такая ошибка   -  person ivanjermakov    schedule 25.05.2018


Ответы (1)


Аннотируйте свой базовый класс A информацией о типе, которая сообщает Джексону, как решить, следует ли десериализовать данный объект json в B.java или C.java.

Пример: с помощью приведенного ниже кода мы сообщаем Джексону, что объект json для A.class будет содержать свойство с ключом type, значение которого может быть либо «b», либо «c». Если значение равно "b", десериализуйте объект до B.class, иначе десериализуйте его до C.class

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")  
@JsonSubTypes({  
    @Type(value = B.class, name = "b"),  
    @Type(value = B.class, name= "c")
    })  
class A {
}

Ниже приведен json, который вам следует использовать.

{
   "a" : { // This will be deserialized to B.class
      "type": "b",
      // field of B.class
   }
}



{
   "a" : { // This will be deserialized to C.class
      "type": "c",
      // field of C.class
   }
}
person Ranjith    schedule 25.05.2018
comment
Я понял это правильно, но важно было то, что базовый класс не может быть создан. Базовый класс должен быть abstract или interface. - person ivanjermakov; 26.05.2018