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.2中提供(请参阅https://jira.springsource.org/browse/SPR-9570)
我只是在当前的M2上测试它,它就像一个开箱即用的魅力(不需要提供附加注释来提供参数化类型,它将由新的MessageConverter自动解决)
| 归档时间: |
|
| 查看次数: |
30888 次 |
| 最近记录: |