Spring Boot Jackson Databind - 配置继承

时间:2018-05-25 01:41:55

标签: java spring-boot jackson jackson-databind

假设我有一个基类A

public class A {
    public String a;
}

两个子课程BC

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) {}

}

问题是Jackson将包装器字段强制转换为基类A

如何配置它以接收正确的类型?

1 个答案:

答案 0 :(得分:1)

使用类型信息注释您的基类A,该信息告诉Jackson如何决定是否应将给定的json对象反序列化为B.javaC.java

Ex:使用下面的代码,我们告诉jackson A.class的json对象将包含一个键为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
   }
}