java - 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) {}
}
问题是 Jackson 将 wrapper field 强制转换为 base class A
。
如何配置它以接收正确的类型?
解决方案
用类型信息注释您的基类A
,告诉杰克逊如何决定是否应该将给定的 json 对象反序列化为B.java
或C.java
。
例如:通过下面的代码,我们告诉杰克逊 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
}
}
推荐阅读
- angular - 后回调没有被调用
- angular - ng-bootstrap 崩溃在 angular10 中不起作用?
- css - 如何更改特定 WooCommerce 类别的背景颜色?
- python - 为什么此导入代码在 Visual Studio Code 中有效但在 IDLE 中无效?
- nginx - 将nginx 8080端口转发到80
- java-8 - java 8 流和 foreach 的特定用例
- linux - Bash脚本如何远程运行命令然后退出远程终端
- matlab - 如何从 Labview 调用 Matlab 函数
- azure - 如何在 Azure WebApps 中调用 Azure AD 身份验证背后的 API?
- node.js - 为什么 sinon 会忽略我对另一个函数的调用?