如何使用Spring MockMvc放置多部分/表单数据?

我有一个控制器的方法,它接收多部分/表单数据:PUT

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

我想用.不幸的是,基本上创建了一个实例,其中有一个方法:MockMvcMockMvcRequestBuilders.fileUploadMockMultipartHttpServletRequestBuilderPOST

super(HttpMethod.POST, urlTemplate, urlVariables)

编辑:当然我可以我不能创建我自己的实现,说MockHttpServletRequestBuilder

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

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

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


答案 1

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

我自己也遇到了同样的问题。虽然我对Sam Brannen的回答感到气馁,但似乎Spring MVC现在确实支持PUT文件上传,因为我可以使用Postman简单地执行这样的请求(我使用的是Spring Boot 1.4.2)。因此,我不断挖掘并发现唯一的问题是返回的by将方法硬编码为“POST”。然后我发现了方法...MockMultipartHttpServletRequestBuilderMockMvcRequestBuilders.fileUpload()with()

这让我想出了这个巧妙的小技巧来强制使用“PUT”方法:MockMultipartHttpServletRequestBuilder

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

    MockMultipartHttpServletRequestBuilder builder =
            MockMvcRequestBuilders.multipart("/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().isOk());

像魔咒一样工作!


答案 2

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

就其价值而言,默认情况下,Spring MVC也不支持文件上传请求。Multipart解析器被硬编码为仅接受文件上传请求 - 无论是Apache Commons还是标准的Servlet API支持。PUTPOST

如果您希望Spring支持其他请求,请随时在Spring的JIRA问题跟踪器中打开票证PUT