#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 уровней глубины