如何处理休养服务的父子关系

时间:2019-07-03 06:54:51

标签: java rest spring-boot

在Spring引导服务中,我有一个如下所示的控制器

@PostMapping 
public ApiResponse generateUKLabel(@RequestBody LabelRequestData data){
  //do operation
}

在这里,LabelRequestData具有基类的列表。 在请求中,我将子类数据与基类数据一起传递。 但是,Child类数据似乎被忽略了。

有什么方法可以访问子类数据。 我想使具有基类的LabelRequestData通用,以便它可以接受多个子类数据。

有什么办法解决吗?

我尝试过铸造。但是抛出不能抛出异常 我也尝试过泛型。但是然后我需要创建两个控制器方法来处理这些请求。我只需要一种控制器方法来处理请求

@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;

}

1 个答案:

答案 0 :(得分:0)

反序列化时,Jackson将不知道必须使用哪个子类,因此它仅采用BaseClass的值,而忽略ChildClass

您可以在BaseClass中使用@JsonTypeInfo,这有助于Jackson识别正确的ChildClass(您必须在json中添加类型)

我不确定BaseClass拥有什么,因此我只是在下面假设随机属性。

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
}