2016-07-25 217 views
5

我有控制器与PUT方法,它接收的multipart/form-data的方法:如何使用Spring MockMvc处理多部分/表单数据?

@RequestMapping(value = "/putIn", method = RequestMethod.PUT) 
    public Foo updateFoo(HttpServletRequest request, 
          @RequestBody Foo foo, 
          @RequestParam("foo_icon") MultipartFile file) { 
    ... 
    } 

和我想用MockMvc对它进行测试。不幸的是MockMvcRequestBuilders.fileUpload创建的MockMultipartHttpServletRequestBuilder基本实例,它具有POST方法:

super(HttpMethod.POST, urlTemplate, urlVariables) 

编辑: 我一定能 我不能创建自己的实施MockHttpServletRequestBuilder,说

public MockPutMultipartHttpServletRequestBuilder(String urlTemplate, Object... urlVariables) { 
    super(HttpMethod.PUT, urlTemplate, urlVariables); 
    super.contentType(MediaType.MULTIPART_FORM_DATA); 
} 

因为MockHttpServletRequestBuilder具有包本地构造函数。

但我想知道更方便 有没有办法做到这一点,可能是我错过了一些现有的类或方法做到这一点?

+0

您能否将我的答案标记为已接受的答案?这将有助于保持StackOverflow的清洁和高效。谢谢! – HammerNL

+1

完成=======> – Andremoniy

回答

18

是的,有一种方法,它也很简单!

我自己遇到了同样的问题。虽然我对Sam Brannen的回答感到沮丧,但现在Spring MVC似乎支持PUT文件上传,因为我可以简单地使用Postman(我使用Spring Boot 1.4.2)做这样的请求。所以,我一直在挖掘,发现唯一的问题是MockMvcRequestBuilders.fileUpload()返回的MockMultipartHttpServletRequestBuilder将该方法硬编码为“POST”。然后我发现了with()方法...

和,让我想出这个整洁的小把戏,迫使MockMultipartHttpServletRequestBuilder反正使用“PUT”方法:

MockMultipartFile file = new MockMultipartFile("data", "dummy.csv", 
      "text/plain", "Some dataset...".getBytes()); 

    MockMultipartHttpServletRequestBuilder builder = 
      MockMvcRequestBuilders.fileUpload("/test1/datasets/set1"); 
    builder.with(new RequestPostProcessor() { 
     @Override 
     public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) { 
      request.setMethod("PUT"); 
      return request; 
     } 
    }); 
    mvc.perform(builder 
      .file(file)) 
      .andExpect(status().ok()); 

就像一个魅力!

+0

很好的解决方法! –

+1

这应该是问题的解决方案,因为它可以解决提问人的问题 – ftrujillo

+0

这肯定应该被标记为答案。 – mogronalol

4

这很不幸在Spring MVC测试中不被支持,除了从标准实现中创建自己的自定义MockPutMultipartHttpServletRequestBuilder和复制粘贴代码之外,我没有看到解决方法。

对于什么是值得的,Spring MVC默认也不支持PUT文件上传请求。 Multipart解析器被硬编码为仅接受POST文件上传请求 - 既适用于Apache Commons,也适用于标准Servlet API支持。

如果您希望Spring支持PUT请求,请随时联系Spring的JIRA问题跟踪器中的open a ticket

+0

我找到了一个简单的解决方案!看看我的回答 – HammerNL

相关问题