El archivo de carga de Webflux no se guarda.
Tengo este fragmento de código:
@PostMapping(value = {"/store"})
public Mono<ResponseEntity<StoreResponse>> store(@RequestPart("file") Mono<FilePart> file,
@RequestPart("publicationId") String publicationId,
@RequestPart("visible") String visible) throws Exception {
return file
.doOnNext(this::checkFile)
.flatMap((f) -> this.saveFileToDatabase(UUID.fromString(publicationId),
f.filename(),
Boolean.parseBoolean(visible)))
.then(Mono.just(ResponseEntity.ok().body(new StoreResponse("", "", "Trabajando",
null))))
.onErrorReturn(ResponseEntity.internalServerError().body(new StoreResponse("No funciona",
"", "Trabajando", null)));
}
Pregunta 1:
Lo extraño de esto es que funciona siempre y cuando use flatMap
en el Mono
.
Cuando cambio a map
en lugar de flatMap
, no funciona (el archivo no se escribirá en una base de datos this.saveFileToDatabase
(a través de spring-data-r2dbc)).
¿Por qué es así?
Pregunta 2:
Cuando quiero realizar otra operación (guardar el archivo en un contenedor de minio) después de guardar en la base de datos, ¿cómo puedo encadenarlo en el código dado? ¿Otro then()
?
davy.ai
Respuesta 1:
El operador
flatMap
se utiliza para manejar tareas asíncronas y devolver un nuevoMono
oFlux
. En este caso, el parámetrofile
es unMono<filepart>
, y utilizandoflatMap
te permite realizar una operación en él (this.saveFileToDatabase
) y devolver un nuevoMono
(Mono<><storeresponse>>
), que luego se propaga aguas abajo. Sin embargo, utilizandomap
solo te permite transformar los datos dentro delMono
sin devolver un nuevoMono
. Entonces, si cambias a usarmap
, el métodothis.saveFileToDatabase
no será llamado y las operaciones aguas abajo no recibirán los datos esperados.Respuesta 2:
Para encadenar otra operación después de guardar el archivo en la base de datos, puedes utilizar el operador
flatMap
con otroMono
que represente la próxima operación. Por ejemplo:Aquí, se asume que
saveFileToMinio
es un método que toma el resultado desaveFileToDatabase
y devuelve un nuevoMono
que representa guardar el archivo en un contenedor de Minio. Puedes encadenar más operaciones utilizando operadoresflatMap
adicionales según sea necesario.