Карта массива 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(){}