Запрос Spring REST с вложенными свойствами (в древовидной структуре)

#spring #spring-boot #spring-rest

#spring #spring-boot #spring-rest

Вопрос:

Я создал конечную точку spring REST с приведенными ниже компонентами, я не уверен, каким должен быть тип «значений»?

 class Group
{
private long groupId;
private long groupIndex;
private List<????> values
}
class Sample
{
 private long sampleId;
 private long sampleIndex;
}
  

Несколько раз я получаю в запросе «значения» в виде списка групп или списка образцов.
пример запроса Json:

Запрос 1:

 {
   "groupId": 1,
   "groupIndex": 2,
   "values": [
      {
         "sampleId": 2,
         "sampleIndex": 555
      },
      {
         "sampleId": 3,
         "sampleIndex": 6
      }
   ]
}
  

Запрос 2:

 {
   "groupId": 1,
   "groupIndex": 2,
   "values": [
      {
         "groupId": 4,
         "groupIndex": 8,
         "values": [
            {
               "sampleId": 2,
               "sampleIndex": 555
            },
            {
               "sampleId": 3,
               "sampleIndex": 6
            }
         ]
      }
   ]
}
  

Комментарии:

1. Наследование может решить вашу проблему.

Ответ №1:

Не могли бы вы попробовать:

 public class Group {
  private Long groupId;
  private Long groupIndex;
  private Long sampleId;
  private Long sampleIndex;
  private List<Group> values;
}
  

Это один из подходов. Не единственный.

Используйте Long вместо long . Так что значения можно обнулять.

Комментарии:

1. если пользователь отправляет «значения» как «список образцов», это не сработает.

2. Есть ли у вас решение без объединения двух свойств класса в один класс?

Ответ №2:

Что вы могли бы сделать, это

 class Group
{
private long groupId;
private long groupIndex;
private List<Object> values
}
class Sample
{
 private long sampleId;
 private long sampleIndex;
}
  

Затем с помощью пользовательского десериализатора вы можете либо вставить List тип в либо Group , либо Sample . ИМХО, я нахожу это беспорядочным и чрезмерно усложняющим конечную точку. Я бы разделил конечную точку на 2 разных метода, которые принимают разные тела запроса, но сохраняют URL-адрес тем же. Spring должен иметь возможность определять, какой метод получает какой тип объекта. Это работает, только если оно проходит на один уровень глубже.

 class SuperGroup
{
private long groupId;
private long groupIndex;
private List<Group> values
}
class Group
{
private long groupId;
private long groupIndex;
private List<Sample> values
}
class Sample
{
 private long sampleId;
 private long sampleIndex;
}

  

Комментарии:

1. и, как и другие, указанные выше, используйте Long вместо long

2. Спасибо за альтернативное решение. Возможно не более 2 уровней глубины