我在使用Jackson映射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);
}
当我调试并查看'entities'值时,它显示为通用对象的ArrayList,而不是我所期望的'Tag'类型的对象列表。
如何让jackson将传递的对象数组映射到“Tag”类型的obejcts列表?
由于
答案 0 :(得分:39)
听起来Spring出于某种原因并没有传递完整的类型信息,而是类型擦除版本,就好像声明类似于List<?> tag
。我不知道可以做些什么来完全解决这个问题(可能需要来自Spring集成团队的东西),但是一个解决方法就是定义你自己的类型:
static class TagList extends ArrayList<Tag> { }
然后使用它。这将通过超类型声明保留泛型参数化,这样即使Spring只传递等效的TagList.class
,杰克逊也可以找出Tag
参数。
答案 1 :(得分:17)
另一种方法是获取一个数组而不是List,如下所示:
@RequestBody Tag[] entities
答案 2 :(得分:0)
Jackson要求在自定义对象上没有参数的默认构造函数,因此您只需要向Tag
类添加默认构造函数。
在您的情况下,只需添加到Tag
班级:
public Tag(){}