Если мне нужно такое определение запроса на публикацию:
@PostMapping(path = "/metadata/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResponseEntity test(HttpServletResponse response,//
@RequestPart(value = "file") MultipartFile file,
@RequestPart(value = "partName") Metadata partName,
@PathVariable(name = "id") String artifactId) {
return null;
}
(где метаданные — это простой Pojo)
а затем используйте следующий тест:
@Test
public void testMetadata() throws Exception {
mockMvc
.perform(multipart(HttpMethod.POST, "/metadata/123")
.file("file", "file content".getBytes())
.part(getJsonPart())
.contentType(MediaType.MULTIPART_FORM_DATA_VALUE))
.andExpect(status().isOk());
}
private @NotNull MockPart getJsonPart() throws JsonProcessingException {
byte[] partContent = new ObjectMapper().writeValueAsBytes(new Metadata("foo"));
MockPart part = new MockPart("partName", partContent);
part.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return part;
}
Оно не соответствует — я получаю ответ 400 вместо 200. Я думаю, что не удается десериализовать полезную нагрузку.
Однако, когда я измените тип части моего постмэппинга с «Метаданные» на «Объект», это работает (десериализация части в виде карты).
Теперь я, вероятно, не вижу чего-то очевидного, но не могу видимо решить это самостоятельно. Есть какие-нибудь подсказки? Еще раз повторю: я пытаюсь получить контроллер с соответствующим десериализованным объектом «Метаданные».
Просто для полноты картины, вот 2 полные файлы:
class Metadata {
private String value;
public Metadata(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
@RestController
public class TestController {
@PostMapping(path = "/metadata/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResponseEntity test(HttpServletResponse response,//
@RequestPart(value = "file") MultipartFile file,
@RequestPart(value = "partName") Metadata partName,
@PathVariable(name = "id") String artifactId) {
return null;
}
@PostMapping(path = "/object/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResponseEntity test(HttpServletResponse response, @RequestPart(value = "file") MultipartFile file,
@RequestPart(value = "partName") Object partName,
@PathVariable(name = "id") String artifactId) {
return null;
}
}
@WebMvcTest(TestController.class)
public class TestControllerTest {
@Autowired
public MockMvc mockMvc;
@Test
public void failingTest() throws Exception {
mockMvc
.perform(multipart(HttpMethod.POST, "/metadata/123")
.file("file", "file content".getBytes())
.part(getJsonPart())
.contentType(MediaType.MULTIPART_FORM_DATA_VALUE))
.andExpect(status().isOk());
}
@Test
public void passingTest() throws Exception {
mockMvc
.perform(multipart(HttpMethod.POST, "/object/123")
.file("file", "file content".getBytes())
.part(getJsonPart())
.contentType(MediaType.MULTIPART_FORM_DATA_VALUE))
.andExpect(status().isOk());
}
private @NotNull MockPart getJsonPart() throws JsonProcessingException {
byte[] partContent = new ObjectMapper().writeValueAsBytes(new Metadata("foo"));
MockPart part = new MockPart("partName", partContent);
part.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return part;
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... ing-issues
Spring/MockMvc: многочастный почтовый запрос файловых и нефайловых частей, вызывающий проблемы с соответствием правильно ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как сделать многочастный запрос/запрос данных с помощью клиента браузера?
Anonymous » » в форуме Php - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-