使用jackson </t>将JSON对象数组映射到@RequestBody List <t>

时间:2012-06-02 16:29:03

标签: json spring hibernate jackson

我在使用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列表?

由于

3 个答案:

答案 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(){}