spring-mvc之curl / Spring MVC : POST gives MissingServletRequestParameterException
我正在使用 Spring MVC
4 和 @RestController
来接收表单发布。 我按照给出的提示做了它 here并且它与 Spring Test
MockMvc
配合良好。
但是,我现在想使用 curl
将内容发布到我的服务器,但我找不到被接受的方法。我总是得到以下异常: org.springframework.web.bind.MissingServletRequestParameterException:必需的字符串参数"file"不存在
我尝试混合使用 Spring
的 @Consumes
和 curl
的 -H
选项, 但它似乎并不相关。
那么,给定以下 @RestController
,应该执行什么 curl
命令来发布内容?
@RestController
@RequestMapping(value = ONE_COLLECTION)
public class OneCollectionController {
@RequestMapping(method = RequestMethod.POST )
public RESTDocumentListElement uploadDocument( @RequestParam("file") MultipartFile file, @RequestPart("data") NewDocumentData documentData ) throws IOException {
// -- code here --
}
}
我试过的最后一条命令(出现异常):
curl http://host/oneCollection -X POST -F "file=@./myFile.txt" -H "Content-Type: multipart/form-data" -F 'data={"name"="myName"}'
工作 Spring 测试
MockMvc
代码:
// ...
MockMultipartFile firstFile = new MockMultipartFile("file", "dummyFile.txt", "text/plain", "blahblah".getBytes());
MockMultipartFile jsonFile = new MockMultipartFile("data", "", "application/json", TestUtil.convertObjectToJsonString(documentData).getBytes() );
ResultActions result = mockMvc.perform(fileUpload(ONE_COLLECTION)
.file(firstFile)
.file(jsonFile)
);
// ...
请您参考如下方法:
想通了!
我已经更改了 Controller 方法映射:
@RequestMapping(method = RequestMethod.POST, consumes = {"multipart/*"})
public RESTDocumentListElement uploadDocument( @RequestPart("file") MultipartFile file, @RequestPart("data") NewDocumentData documentData ) throws IOException {
但棘手的部分是我的 JavaConfig 中的 MultipartResolver
,我使用的是 Servlet 3 提供的标准 StandardServletMultipartResolver
,并且不得不切换到 Apache Commons 之一:
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
return multipartResolver;
}
所以我也需要对 maven 有一些依赖
<!-- Apache Commons -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
最后,curl 命令是:
curl http://host/oneCollection -X POST -F 'file=@./firstFile.txt;type=text/plain' -F 'data={"collection":"toto"};type=application/json' -H "Content-Type: multipart/form-data"
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。