首页 > 解决方案 > 如何处理 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;

}

标签: javarestspring-boot

解决方案


当反序列化杰克逊将不知道必须使用哪个子类,所以它只取值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
}

推荐阅读