Преобразование между org.springframework.web.multipart.MultipartFile и org.springframework.core.io.Resource - PullRequest
1 голос
/ 24 марта 2020

Я пытаюсь передать ресурс как @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. Я использую Mock MVC для этого:

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 в моих интеграционных тестах (и в другом сервисе, использующем мой API). Я попытался реализовать org.springframework.web.multipart.MultipartFile, обернув свой ByteArrayResource, но он не выглядит правильным (и не работает). Я потратил слишком много времени на это уже ... Любые рекомендации?

PS Я использую StandardServletMultipartResolver

1 Ответ

0 голосов
/ 01 апреля 2020

Я получил @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();
...