Estoy tratando de usar la nueva implementación reactiva web-mvc en una aplicación spring boot 2.0. Estoy tratando de definir un método que consuma un archivo de varias partes pero no logre que funcione :( - Siempre recibo un error 415.
Por un lado, tengo un controlador que contiene el siguiente mapeo de solicitudes:
@RequestMapping(method = RequestMethod.POST, path = "/myPath/{param}/{param2}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @ResponseBody public Mono<Void> postFile( @RequestBody MultipartFile data, @PathVariable("param") String param, @PathVariable("param2") String param2, @RequestHeader(name = HEADER_DATE, required = false) @DateTimeFormat(pattern = DATE_FORMAT) Instant instant ){ return fileService.handleData(Mono.just(data), param, param2, instant); } Por otro lado, tuve que agregar un servidor en la parte superior de las dependencias básicas, ya que parece que Netty no maneja archivos de varias partes. Así que agregué la dependencia spring-boot-starter-tomcat que permitió que MultipartAutoConfiguration coincidiera y se cumpliera en la configuración automática de la aplicación.
Al publicar algo usando una llamada curl: curl 'Meta-Date: 20170101104532' --form "file=@file.bin" http://localhost:8082/myPath/foo/bar mientras los registros de depuración están activados ( logging.level.org.springframework.web=DEBUG ) Recibí esta excepción: org.springframework.web.server.UnsupportedMediaTypeStatusException: Request failure [status: 415, reason: "Content type 'multipart/form-data;boundary=------------------------58fa43b8f1a26de4' not supported"]
Este error lo RequestBodyArgumentResolver que tiene los siguientes tipos de medios admitidos: [*/*, text/xml, application/*+json;charset=UTF-8, application/xml, text/plain;charset=UTF-8, application/x-www-form-urlencoded, application/json;charset=UTF-8] proporcionado por 9 DecoderHttpMessageReader .
Antes de publicar también eché un vistazo a:
MultipartAutoConfiguration#multipartResolver matchedContent-Transfer-Encoding: binary no cambió nada. Según tengo entendido, Spring web 5.0 usa un nuevo sistema de decodificador de solicitudes, ya que no encuentro estas clases en una aplicación de arranque Spring 4, y todavía no hay ningún DecoderHttpMessageReader que se ocupe de un archivo de varias partes. ¿Me perdí algo? ¿O debo esperar a que se implemente uno?
De acuerdo, parece que esto simplemente no está implementado por ahora, ya que actualmente existe una solicitud de extracción para esta función: Agregar soporte de solicitud multiparte reactiva # 1201
Debería haber comprobado esto antes...
[EDITAR]: el problema se resolvió y se fusionó con la rama principal de Spring. Ya no debería ser un problema.
@PutMapping(value="/{..}",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public Mono<Void> save(@RequestPart("file") FilePart multipartFormData,@RequestParam("fileName") String fileName,@PathVariable("..") String ..) throws IOException { List<ByteBuffer> bytesList = new LinkedList<>(); multipartFormData.content(). subscribe(item->bytesList.add(item.asByteBuffer())); int totalBytes = bytesList.stream().mapToInt(item->item.capacity()).sum(); ByteBuffer buffer = ByteBuffer.allocate(totalBytes); bytesList.stream().forEach(byteBuff->buffer.put(byteBuff)); baseImageHandler.saveImage(buffer, fileName, baseItemId); return Mono.empty(); }Tenga en cuenta que es una versión de desarrollo, pero así es como me las arreglé para hacerlo.