Spring/MockMvc: многочастный почтовый запрос файловых и нефайловых частей, вызывающий проблемы с соответствием правильноJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Spring/MockMvc: многочастный почтовый запрос файловых и нефайловых частей, вызывающий проблемы с соответствием правильно

Сообщение Anonymous »

Если мне нужно такое определение запроса на публикацию:
@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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»