Solución:
De hecho, puede simplificar su vida aquí, ya que todo lo que está haciendo es enviar un formulario que contiene algunos campos y un archivo. usted no necesita @RequestBody para lo que está tratando de hacer. Puede usar las funciones regulares de Spring MVC, por lo que su método de controlador se vería así:
@ResponseBody
public WebResponse<Boolean> updateEUSettings(
Locale locale,
@Valid EUPSettingsWrapper endUserPortalSettingsWrapper,
@RequestParam(value = "file1", required = true) MultipartFile logo
) {
}
El cliente que envía la solicitud a este controlador deberá tener un formulario con enctype="multipart/form-data"
.
En su prueba de Spring MVC, escribiría algo como esto:
getMockMvc().perform(fileUpload(uri).file("file1", "some-content".getBytes())
.param("someEuSettingsProperty", "someValue")
.param("someOtherEuSettingsProperty", "someOtherValue")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.MULTIPART_FORM_DATA))
.andExpect(status().isOk());
Agregue el siguiente bean en su spring-servlet.xml para agregar el soporte para la solicitud de varias partes.
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
Además, no olvide agregar la dependencia para tarro de carga de archivos comunes
No pude encontrar una manera de usar @RequestBody.
Sin embargo, puede hacer algo como esto:
@RequestMapping(value = "/uploadStuff", method = RequestMethod.POST)
public MyViewDto doStuff(@RequestPart("json") @Valid MyDto dto,
@RequestPart("file") MultipartFile file) { ... }
Puedes probarlo así:
MockMultipartFile jsonFile = new MockMultipartFile("json", "",
"application/json", "{}".getBytes());
MockMultipartFile dataFile = new MockMultipartFile("file", "foo.zip", "application/octet-stream", bytes);
mockMvc.perform(fileUpload("/uploadStuff")
.file(dataFile)
.file(jsonFile))
.andExpect(status().isOk());