20

我在使用 Jackson 映射 Javascript 发布的 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,而不是我期望的“标记”类型的对象列表。

如何让杰克逊将传递的对象数组映射到“标签”类型的对象列表?

谢谢

4

3 回答 3

41

听起来 Spring 出于某种原因没有传递完整的类型信息,而是一个类型擦除的版本,好像声明类似于List<?> tag. 我不知道可以做些什么来完全解决这个问题(可能需要 Spring 集成团队提供的东西),但一种解决方法是定义您自己的类型,例如:

static class TagList extends ArrayList<Tag> { }

并改用它。这将通过超类型声明保留通用参数化,因此即使 Spring 仅传递等效的TagList.class,Jackson 也可以找出Tag参数。

于 2012-06-02T17:20:01.683 回答
20

另一种方法是获取数组而不是列表,如下所示:

@RequestBody Tag[] entities
于 2014-06-03T16:17:25.540 回答
1

Jackson 需要在自定义对象上没有参数的默认构造函数,因此您只需将默认构造函数添加到您的Tag类。

在您的情况下,只需添加到您的Tag课程中:

public Tag(){}
于 2017-04-03T17:57:29.023 回答