2013-10-07 118 views
0

我有一个有些简单化控制器,被配置为这样:的ModelAttribute不映射应用程序/ x-WWW窗体-urlencoded

@RequestMapping(value = "user/savearticle", method = RequestMethod.POST) 
public @ResponseBody 
Object saveArticle(@ModelAttribute("article")RawArticle rawArticle); 

使用从here截取的代码片段,我用于控制器看起来做了一个试验的情况下像这样:

MvcResult resultActions = 
     mockMvc.perform(MockMvcRequestBuilders.post("/user/savearticle") 
     .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
     .content(convertObjectToForumUrlEncodedBytes(rawArticle))) 
     .andReturn(); 

我只是打印出结果。在任何情况下,的ModelAttribute“rawArticle”不断最终成为空当它进入控制器的实现,但是当我用这个:

MvcResult resultActions = mockMvc.perform(
     MockMvcRequestBuilders.post("/user/savearticle") 
     .param("title", rawArticle.getTitle()) 
     .param("tags", rawArticle.getTags()) 
     .param("body", rawArticle.getBody()) 
     .param("author", rawArticle.getAuthor())).andReturn(); 

的映射实际上就像一个魅力。我想要的是,第一个测试正确处理,因为它似乎是错误的,它没有被映射,我认为它应该是类似的控制器主要是由另一个程序通过网络使用Apache HTTP(它自动通过urlencoded形式)。

你们有什么想法我可以犯一个错误吗?我不会介意张贴我的上下文配置的片段,如果你认为你需要它来评估问题(或我为此事POM,只是告诉我,我可能已经错过了什么库应该是足够了)

更新: 我在测试编号1中将POJO插入到会话中时犯了一个错误,我只是在此删除它。问题是一样的。

回答

0

内容是请求的内容正文,您正在使用的内容类型需要在内容正文中的URL 而不是中编码的所有内容。如果你想使用内容主体,你必须使用@RequestBody而不是@ModelAttribute,Spring根据请求参数进行数据绑定。

相关问题