REST与Spring和Jackson完全数据绑定

我正在使用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";
    }

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

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

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

但我想知道在使用Spring MVC和MappingJacksonHttpMessageConverter时,最好的方法是什么。 任何提示?

谢谢


我怀疑问题是由于类型擦除,即不是传递泛型参数类型,可能只有actions.getClass()传递; 这会给类型相当于List <?>。

如果这是真的,则有一种可能性是使用中间子类,如:

public class ActionImplList extends ArrayList<ActionImpl> { }

因为即使只有类被传递,这也会保留类型信息。 那么:

public @ResponseBody String executeActions(@RequestBody ActionImplList actions)

会做的伎俩。 不是最优的,但应该工作。

我希望有更多Spring MVC知识的人可以阐明为什么参数类型没有被传递(可能它是一个错误?),但至少有一个解决方法。


我发现你也可以通过使用数组作为@RequestBody而不是集合来解决类型擦除问题。 例如,以下内容将起作用:

public @ResponseBody String executeActions(@RequestBody ActionImpl[] actions) { //... }

有关您的信息,该功能将在Spring 3.2中提供(请参阅https://jira.springsource.org/browse/SPR-9570)

我刚刚在当前的M2上进行了测试,它的工作方式就像是一个开箱即用的魅力(无需提供额外的注释来提供参数化类型,它将由新的MessageConverter自动解析)

链接地址: http://www.djcxy.com/p/8599.html

上一篇: REST with Spring and Jackson full data binding

下一篇: Spring MVC : post request and json object with array : bad request