我正在使用Spring MVC
4与@RestController
一起收到表单帖子。
我按照here给出的提示进行了操作,并且与Spring Test
MockMvc
配合使用。
但是,我现在想用curl
将内容发布到我的服务器上,但我找不到一种方法可以接受。我总是得到以下异常:
org.springframework.web.bind.MissingServletRequestParameterException:必需的字符串参数'file'不存在
我尝试与@Consumes
中的Spring
和-H
中的curl
选项混合使用,但它似乎并不相关。
因此,给定以下@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 Test
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)
);
// ...
答案 0 :(得分:4)
想出来了!
我已将控制器方法映射更改为:
@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"