Spring Boot Jackson Databind - Настройка наследования - PullRequest
0 голосов
/ 25 мая 2018

Предположим, у меня есть базовый класс 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.

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

1 Ответ

0 голосов
/ 25 мая 2018

Аннотируйте ваш базовый класс 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
   }
}
...