Curl / Spring MVC:POST给出MissingServletRequestParameterException

时间:2014-06-11 12:24:41

标签: spring-mvc post curl file-upload multipartform-data

我正在使用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)
    );

// ...

1 个答案:

答案 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"