java - 如何处理 Rest 服务的父子关系
问题描述
在我的 Spring Boot 服务中,我有一个控制器,如下所示
@PostMapping
public ApiResponse generateUKLabel(@RequestBody LabelRequestData data){
//do operation
}
在这里,LabelRequestData 具有基类列表。在中,请求我将子类数据与基类数据一起传递。但是,子类数据似乎被忽略了。
有什么办法可以访问子类数据。我想让 LabelRequestData 与 Base 类通用,以便它可以接受多个子类数据。
有什么办法可以解决吗?
我试过铸造。但是 throws 不能抛出异常我也尝试过泛型。但随后我需要创建两个控制器方法来处理这些请求。我只想要一种控制器方法来处理请求
@Data
public class LabelRequestData extends BaseRequestData {
@Valid
private List<BaseClass> labelData; // this base class has multiple child classes that i need
@Valid
private PreferenceData preferenceData;
}
解决方案
当反序列化杰克逊将不知道必须使用哪个子类,所以它只取值BaseClass
并忽略ChildClass
您可以@JsonTypeInfo
在 BaseClass 中使用,这有助于Jackson
识别正确的ChildClass
(您必须在 json 中添加类型)
我不确定是什么BaseClass
,所以我只是假设下面的随机属性。
基类.java
@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = ChildOne.class, name = "childOne"),
@JsonSubTypes.Type(value = ChildTwo.class, name = "childTwo")})
public class BaseClass {
private Integer id;
}
ChildOne .java
@Data
public class ChildOne extends BaseClass {
private String name;
}
ChildTwo.java
@Data
public class ChildTwo extends BaseClass {
private String address;
}
如果您请求 Json,
{
"labelData": [
{
"id": 0, // -|
"type": "childOne", // |-> This will go to ChildOne.class
"name": "Foo" // _|
}, {
"id": 0, // -|
"type": "childTwo", // |-> This will go to ChildTwo.class
"address": "Somewhere in Earth"// _|
}
]
// Rest of Json
}
推荐阅读
- nginx - 我需要关于设置 Nginx 的建议
- reactjs - react JS属性与属性不同吗?
- node.js - 如何轻松创建参赛表格
- sharepoint - Sharepoint 设计器工作流程:多项选择字段的条件
- git - 奇怪的 git 问题。Git pull 导致文件更改
- three.js - 如何使用 Threejs 编辑器中的 KHR_materials_pbrSpecularGlossiness 导出 GLTF 模型
- reactjs - 如何使用 React Router 在 React 中渲染这个对象?
- android - androidx getFragmentManager() 已被弃用
- css - css中多级导航栏的平滑悬停效果
- php-7.2 - OroCRM - Symfony 类在将 PHP 版本从 7.1 升级到 7.2 后找不到 PHP 可执行二进制文件