Карта массива JSON объектов в список @RequestBody <T> с использованием джексона
У меня возникают проблемы с использованием Jackson для отображения JSON-массива хэшей (тегов).
Вот данные, полученные контроллером @RequestBody (он отправляется с правильным json requestheader):
[{name=tag1}, {name=tag2}, {name=tag3}]
Вот контроллер:
@RequestMapping(value = "purchases/{purchaseId}/tags", method = RequestMethod.POST, params = "manyTags")
@ResponseStatus(HttpStatus.CREATED)
public void createAll(@PathVariable("purchaseId") final Long purchaseId, @RequestBody final List<Tag> entities)
{
Purchase purchase = purchaseService.getById(purchaseId);
Set<Tag> tags = purchase.getTags();
purchaseService.updatePurchase(purchase);
}
Когда я отлаживаю и просматриваю значение "сущности", оно отображается как ArrayList общих объектов, а не как список объектов типа "тег", как я ожидал.
Как я могу получить джексон для сопоставления переданного массива объектов с списком объектов типа "Тег"?
Спасибо
Ответы
Ответ 1
Похоже, что Spring по какой-то причине не передает полную информацию о типе, а скорее тип стираемой версии, как будто объявление было чем-то вроде List<?> tag
. Я не знаю, что можно сделать, чтобы полностью разрешить это (может понадобиться что-то из команды интеграции Spring), но один способ - определить свой собственный тип, например:
static class TagList extends ArrayList<Tag> { }
и используйте это вместо этого. Это сохранит общую параметризацию с помощью объявлений супертипа, так что даже если Spring проходит только эквивалент TagList.class
, Джексон может определить параметр Tag
.
Ответ 2
Другой способ сделать это - скорее получить массив, чем список, следующим образом:
@RequestBody Tag[] entities
Ответ 3
Jackson требует конструктора по умолчанию, не имеющего параметров для пользовательских объектов, поэтому вам нужно просто добавить конструктор по умолчанию в класс Tag
.
В вашем случае просто добавьте в класс Tag
:
public Tag(){}