spring-mvc之curl / Spring MVC : POST gives MissingServletRequestParameterException

虾米哥 阅读:117 2025-02-15 21:57:57 评论:0

我正在使用 Spring MVC 4 和 @RestController 来接收表单发布。 我按照给出的提示做了它 here并且它与 Spring Test MockMvc 配合良好。

但是,我现在想使用 curl 将内容发布到我的服务器,但我找不到被接受的方法。我总是得到以下异常: org.springframework.web.bind.MissingServletRequestParameterException:必需的字符串参数"file"不存在

我尝试混合使用 Spring@Consumescurl-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"  


标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号