Aquí están los detalles del enfoque:
Estoy pasando el objeto de archivo de varias partes a otro servicio de API de descanso. Aquí está el código. (El método HTTP es POST, la URL es "/uploadDocument")
public ResponseEntity<String> executeMultipartRequest(String url, HttpMethod method, MultipartFile obj){ HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); requestHeaders.add("Accept", MediaType.APPLICATION_JSON_VALUE); MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); body.add("file", obj.getResource()); HttpEntity<?> requestEntity = new HttpEntity<>(body, requestHeaders); return restTemplate.exchange(url, method, requestEntity, String.class); }Este es el servicio al que llamo desde el método anterior:
@PostMapping(value = "/uploadDocument", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("userName") String userName) { return null; // removed actual code. }Pero cuando ejecuto el método obtengo el siguiente error:
org.apache.catalina.core.StandardWrapperValve invocar GRAVE: Servlet.service() para servlet [despachador] en contexto con ruta [/attest] arrojó excepción [Procesamiento de solicitud fallido; la excepción anidada es org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [sin cuerpo]] con causa raíz org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [sin cuerpo]
¿Alguna idea de cuál es exactamente el problema?
También quiero saber, ¿es correcto el enfoque?
¿Se requiere algún cambio?
¿Alguna sugerencia?
Gracias,
Atul
Puedo enviar el objeto MultipartFile a través de la API de descanso.
Estos son los cambios que hice en el código existente que mencioné en la pregunta.
Este es el código de trabajo:
public ResponseEntity<String> executeMultipartRequest(String url, HttpMethod method, Object obj, Map<String, String> dataMap){ HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); requestHeaders.setCacheControl(CacheControl.noCache()); MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); ContentDisposition contentDisposition = ContentDisposition.builder("form-data") .name("file") .filename(((MultipartFile)obj).getOriginalFilename()) .build(); body.add(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()); body.add("file", ((MultipartFile)obj).getResource()); body.add("Content-Type", ((MultipartFile)obj).getContentType()); addData(body, dataMap); HttpEntity<?> requestEntity = new HttpEntity<>(body, requestHeaders); logger.debug("executeMultipartRequest => before executing rest api request."); return restTemplate.exchange(url, method, requestEntity, String.class); } private void addData(MultiValueMap<String, Object> body, Map<String, String> dataMap) { if(!dataMap.isEmpty()){ dataMap.forEach((key, value) -> body.add(key, value)); } }La solución que apliqué es enviar el archivo como datos de formulario agregándolo a ContentDisposition.
Establezca las propiedades requeridas.
La URL del punto final es la misma que se menciona en la pregunta.