我有一个稍微简化的控制器配置如下:
@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的会话中,我只是将其删除。问题是一样的。
答案 0 :(得分:0)
内容是请求的内容正文,您使用的内容类型需要在内容正文中的网址不中编码的所有内容。如果您要使用必须使用的内容正文@RequestBody
而不是@ModelAttribute
,则Spring会根据请求参数执行数据绑定。