es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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()?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Respuesta 1:
    El operador flatMap se utiliza para manejar tareas asíncronas y devolver un nuevo Mono o Flux. En este caso, el parámetro file es un Mono<filepart>, y utilizando flatMap te permite realizar una operación en él (this.saveFileToDatabase) y devolver un nuevo Mono (Mono<><storeresponse>>), que luego se propaga aguas abajo. Sin embargo, utilizando map solo te permite transformar los datos dentro del Mono sin devolver un nuevo Mono. Entonces, si cambias a usar map, el método this.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 otro Mono que represente la próxima operación. Por ejemplo:

    .flatMap((f) -> this.saveFileToDatabase(UUID.fromString(publicationId),
                    f.filename(),
                    Boolean.parseBoolean(visible))
                    .flatMap((result) -> saveFileToMinio(result))
            )
    

    Aquí, se asume que saveFileToMinio es un método que toma el resultado de saveFileToDatabase y devuelve un nuevo Mono que representa guardar el archivo en un contenedor de Minio. Puedes encadenar más operaciones utilizando operadores flatMap adicionales según sea necesario.

Comments are closed.