org.springframework.web.multipart.MultipartFile 和 org.springframework.core.io.Resource 之间的转换

Conversion between org.springframework.web.multipart.MultipartFile and org.springframework.core.io.Resource

我正在尝试将资源作为 @RequestPart 传递给我的控制器。

@RequestPart(name = "resource", required = false) Resource multipartFile,

它似乎在我的集成测试中运行良好,我将其作为资源传递:

ByteArrayResource resource = new ByteArrayResource(new byte[] {65, 66, 67});    
MultipartBodyBuilder b = new  MultipartBodyBuilder();
b.part("resource", resource, MediaType.APPLICATION_PDF);
return webClient.post().uri(getUri()
                       .contentType(MediaType.MULTIPART_FORM_DATA)
                       .syncBody(b.build())
                       .retrieve()
                       .bodyToMono(Long.class);

但是在单元测试中,我总是收到 resource = null。我为此使用 MockMVC:

MvcResult result = mvc.perform(
            multipart(getUri())
                .file("resource", new byte[] {65, 66, 67})
                .content(new byte[] {65, 66, 67})
                .accept(MediaType.MULTIPART_FORM_DATA)
            .andExpect(status().isOk())
            .andReturn();

另一方面,如果我在我的控制器中切换到使用 MultipartFile 作为参数类型:

@RequestPart(name = "resource", required = false) MultipartFile multipartFile

如果我在单元测试中通过了 MockMultipartFile,它会起作用,但我不知道如何在我的集成测试中通过 MultipartFile(以及在使用我的 [= 的其他服务中) 33=]).我尝试通过覆盖我的 ByteArrayResource 来实现 org.springframework.web.multipart.MultipartFile,但它看起来不正确(并且不起作用)。我已经在这上面花了太多时间...有什么建议吗?

P.S。我使用 StandardServletMultipartResolver

我最终在控制器中使用了 @RequestPart(name = "resource") Part part,它适用于

ByteArrayResource resource = new ByteArrayResource(new byte[] {1, 2, 3});    
MultipartBodyBuilder b = new MultipartBodyBuilder();
b.part("resource", resource, MediaType.APPLICATION_PDF);
return webClient.post().uri(getUri()
    .contentType(MediaType.MULTIPART_FORM_DATA)
    .syncBody(b.build())
    .retrieve()
    .bodyToMono(Long.class);

Part part = new MockPart("resource", new byte[]{1,2,3})
MvcResult result = mvc.perform(multipart(getUri())
    .part(part)
    .andExpect(status().isOk())
    .andReturn();