Как обрабатывать отношения родитель-потомок для службы Отдых - PullRequest
0 голосов
/ 03 июля 2019

В моем сервисе загрузки Spring у меня есть контроллер, как показано ниже

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

Здесь LabelRequestData имеет список базового класса. В запросе я передаю данные дочернего класса с данными базового класса. Но данные дочернего класса, похоже, игнорируются.

Есть ли способ получить доступ к данным дочернего класса. Я хочу сделать 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 голосов
/ 03 июля 2019

При десериализации Джексон не будет знать, какой дочерний класс должен использоваться, поэтому он принимает только значение BaseClass и игнорирует ChildClass

. Вы можете использовать @JsonTypeInfo вBaseClass, это помогает 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...