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

Tho*_*ley 18 spring json hibernate jackson

我在使用Jackson映射Javascript发布的JSON哈希数组(Tag)时遇到了问题.


这是控制器@RequestBody收到的数据(使用正确的json请求头发送):

[{name=tag1}, {name=tag2}, {name=tag3}]
Run Code Online (Sandbox Code Playgroud)


这是控制器:

@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);
    }
Run Code Online (Sandbox Code Playgroud)

当我调试并查看"实体"值时,它显示为通用对象的ArrayList,而不是像我期望的那样"Tag"类型的对象列表.

如何让jackson将传递的对象数组映射到"Tag"类型的obejcts列表?

谢谢

Sta*_*Man 40

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

static class TagList extends ArrayList<Tag> { }
Run Code Online (Sandbox Code Playgroud)

并使用它.这将通过超类型声明保留泛型参数化,这样即使Spring只通过等效的TagList.class,Jackson也可以找出Tag参数.


小智 17

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

@RequestBody Tag[] entities
Run Code Online (Sandbox Code Playgroud)