Вопрос по json, spring – Сопоставить массив объектов JSON с @RequestBody List <T>, используя jackson

15

У меня проблемы с использованием Джексона для сопоставления размещенного в Javascript массива хэшей JSON (Tag).


Вот данные, полученные контроллером @RequestBody (отправляется с правильным заголовком запроса json):

[{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 общих объектов, а не как список объектов типа «тег»; как я и ожидал.

Как я могу заставить Джексона отобразить переданный массив объектов в список объектов типа «тег»?

Спасибо

ты пробовал это так?[{"name"="tag1"}, {"name"="tag2"}, {"name"="tag3"}] Sean Patrick Floyd
Я не пробовал этого Шона, я решил использовать вместо него массив для @RequestBody. Увидетьstackoverflow.com/questions/4441557/… Thomas Buckley

Ваш Ответ

3   ответа
17

а не список, как показано ниже:

@RequestBody Tag[] entities
Error: User Rate Limit Exceeded
0

Джексону требуется конструктор по умолчанию без параметров в пользовательских объектах, поэтому вам нужно просто добавить конструктор по умолчанию в свой объект.Tag учебный класс.

В вашем случае просто добавьте в свойTag учебный класс:

public Tag(){}
39

Похоже, что Spring по какой-то причине не передает полную информацию о типе, а скорее стертую версию, как будто объявление было чем-то вродеList<?> tag, Я не знаю, что можно сделать, чтобы полностью решить эту проблему (может понадобиться что-то от команды интеграции Spring), но одно решение - определить свой собственный тип, например:

static class TagList extends ArrayList<Tag> { }

и используйте это вместо этого. Это сохранит общую параметризацию через объявления супертипов, так что даже если Spring передает только эквивалентTagList.classДжексон может выяснитьTag параметр.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/4441557/… Thomas Buckley
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы