ModelAttribute不映射application / x-www-form-urlencoded

时间:2013-10-07 06:27:00

标签: java spring modelattribute

我有一个稍微简化的控制器配置如下:

@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”在进入控制器的实现时都会以null结尾,但是当我使用它时:

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,但只是告诉我我可能错过的库应该就够了)

更新: 我错误地将POJO插入到测试编号1的会话中,我只是将其删除。问题是一样的。

1 个答案:

答案 0 :(得分:0)

内容是请求的内容正文,您使用的内容类型需要在内容正文中的网址中编码的所有内容。如果您要使用必须使用的内容正文@RequestBody而不是@ModelAttribute,则Spring会根据请求参数执行数据绑定。