我使用Spring创建控制器的大部分经验是用于使用JSON格式请求的REST控制器。我一直在寻找关于如何为表单提交进行测试的文档,到目前为止,我理解它应该使用MockMvc
MvcResult result = mockMvc.perform(post("/submit")
.param('title', 'test title')
.param('description', 'test description'))
.andReturn()但是,我不知道如何将表单参数映射到模型对象。我在我的搜索中看到@ModelAttribute注释弹出,但我不知道它应该如何用于映射。此外,官方文档中的这个快速启动指南没有详细说明像th:object和th:field这样的东西是如何转换成th:object和th:field编码的形式的。
我的控制器代码类似于以下内容:
@PostMapping('/submit')
def submit(@ModelAttribute WriteUp writeUp) {
//do something with writeUp object
'result'
}发布于 2016-11-27 08:50:30
通过反复试验,我发现我的具体问题可能是特定于Groovy的。那里的测试代码和控制器代码,原来,没有问题。为了再次测试表单提交,请通过param的perform方法使用MockMvcRequestBuilders方法。另一件需要注意的事情是,如果没有指定内容类型,这似乎不起作用。下面是一个适合我的示例测试代码:
MvcResult result = webApp.perform(post("/submit")
.contentType(APPLICATION_FORM_URLENCODED) //from MediaType
.param('title', 'test title')
.param('description', 'test description'))
.andReturn()正如你所看到的,它和我最初发布的没有太大的不同。控制器代码几乎是一样的,@ModelAttribute工作得很好。
但是,我的设置的问题是,由于我使用了Groovy,所以我假设getter和setter是在我的WriteUp 类中自动生成的。下面是WriteUp类最初的样子:
class WriteUp {
private String title
private String description
}我已经有一段时间没有用Groovy编写代码了,上次我这样做的时候,可以假定上面的类有getters和setters。然而,事实证明并非如此。为了解决我的具体问题,我将字段中的访问修饰符更新为default (包级别)。
class WriteUp {
String title
String description
}发布于 2016-11-26 17:23:03
我已经在我的搜索中看到@ModelAttribute注释弹出,但我不知道它应该如何用于映射。
使用writeUp标记@ModelAttribute对象时,Spring容器将填充参数(如title、description等)从HttpServletRequest对象&将对象注入控制器方法,当请求从客户机到服务器时(可以是浏览器或MockMvc单元测试客户端或其他任何东西)。
另外,对于你的快速理解,几乎没有其他的基本要点:
(1) Controller方法映射到URI和RequestMethod (如POST/GET/DELETE/PUT .)如下所示:
@RequestMapping(value="/submit", method=RequestMethod.POST)
public String submit(@ModelAttribute WriteUp writeUp) {
//Call the service and Save the details
model.addAttribute("Writeup details added successfully");
return "writeUpResult"; //Returns to the View (JSP)
}(2) @ModelAttribute将映射到http /PUT请求的对象(如您的writeUp),其中html数据是http的一部分。
(3) @RequestParam或@PathParam将用于http请求,其中参数是URL的一部分(即不是http的一部分)。
您可以通过这里了解DispatcherServlet请求处理& Spring基本web流。
https://stackoverflow.com/questions/40820745
复制相似问题