一尘不染

带有Spring和Jackson的REST完整数据绑定

json

我正在使用Spring MVC处理JSON POST请求。在幕后,我使用的是在Jackson
JSON处理器上构建的MappingJacksonHttpMessageConverter,并在使用mvc:annotation驱动时启用了该功能。

我的一项服务收到了一系列操作:

@RequestMapping(value="/executeActions", method=RequestMethod.POST)
    public @ResponseBody String executeActions(@RequestBody List<ActionImpl> actions) {
        logger.info("executeActions");
        return "ACK";
    }

我发现杰克逊将requestBody映射到java.util.LinkedHashMap项列表(简单数据绑定)。相反,我希望将请求绑定到类型对象列表(在本例中为“
ActionImpl”)。

我知道,如果直接使用Jackson的ObjectMapper,这很容易做到:

List<ActionImpl> result = mapper.readValue(src, new TypeReference<List<ActionImpl>>() { });

但是我想知道使用Spring MVC和MappingJacksonHttpMessageConverter时实现此目标的最佳方法是什么。有什么提示吗?

谢谢


阅读 217

收藏
2020-07-27

共1个答案

一尘不染

我怀疑问题是由于类型擦除引起的,即,不是传递通用参数类型,而是仅传递了actions.getClass();这将提供与List <?>等效的类型。

如果是这样,一种可能性是使用中间子类,例如:

public class ActionImplList extends ArrayList<ActionImpl> { }

因为即使只传递类,这也会保留类型信息。因此:

public @ResponseBody String executeActions(@RequestBody ActionImplList actions)

会成功的 不是最佳,但应该可以。

我希望有更多Spring MVC知识的人可以阐明为什么不传递参数类型(也许是错误?),但是至少可以解决此问题。

2020-07-27