REST与Spring和Jackson完全数据绑定

Jav*_*ero 38 rest spring json spring-mvc jackson

我正在使用Spring MVC来处理JSON POST请求.在封面下我使用基于Jackson JSON处理器构建的MappingJacksonHttpMessageConverter,并在使用mvc:annotation-driven时启用.

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

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

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

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

List<ActionImpl> result = mapper.readValue(src, new TypeReference<List<ActionImpl>>() { }); 
Run Code Online (Sandbox Code Playgroud)

但我想知道在使用Spring MVC和MappingJacksonHttpMessageConverter时实现这一目标的最佳方法是什么.任何提示?

谢谢

小智 42

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

public @ResponseBody String executeActions(@RequestBody ActionImpl[] actions) { //... }
Run Code Online (Sandbox Code Playgroud)


Sta*_*Man 27

我怀疑问题是由于类型擦除,即不是传递泛型参数类型,也许只传递actions.getClass(); 这将给出类似List <?>的类型.

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

public class ActionImplList extends ArrayList<ActionImpl> { }
Run Code Online (Sandbox Code Playgroud)

因为这将保留类型信息,即使只传递了类.那么:

public @ResponseBody String executeActions(@RequestBody ActionImplList actions)
Run Code Online (Sandbox Code Playgroud)

会做的伎俩.不是最佳的,但应该工作.

我希望有更多Spring MVC知识的人可以阐明为什么没有传递参数类型(也许这是一个bug?),但至少有一个解决方法.

  • 此问题发生在Spring 3.1中,但已在Spring 3.2中修复:https://jira.spring.io/browse/SPR-9570 (2认同)

Fré*_*ric 8

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

我只是在当前的M2上测试它,它就像一个开箱即用的魅力(不需要提供附加注释来提供参数化类型,它将由新的MessageConverter自动解决)