развернуть строку из моно <String> - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть сервис, который обслуживает загрузку изображения на сервер. Я использовал Java Spring Reactive на этом сервисе, я переименовываю файл с помощью dateformat и должен вернуть это новое имя. Вот что я делаю в своем сервисе:

@Override
public Mono<String> createImage(Flux<FilePart> files) {
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
    final String[] fileName = {""};

    return files.flatMap(file -> {
        Mono<Void> copyFile = Mono.just(Paths.get(UPLOAD_ROOT, dateFormat.format(date) + "." + FilenameUtils.getExtension(file.filename())).toFile())
                .log("createImage-picktarget").map(destFile -> {
                    try {
                        fileName[0] = dateFormat.format(date) + "." + FilenameUtils.getExtension(file.filename());
                        destFile.createNewFile();
                        return destFile;
                    } catch (IOException ioe) {
                        throw new RuntimeException(ioe);
                    }
                }).log("createImage-newFile").flatMap(file::transferTo).log("createImage-copy");

        return Mono.when(copyFile).log("createImage-when");
    }).log("createImage-flatMap").then(Mono.just(fileName[0])).log("createImage-done");
}

этот код возвращает Mono моему контроллеру. В этом контроллере мне нужно вернуть String in Mono клиенту, потому что эта строка содержит новое загруженное имя файла, которое необходимо во внешнем интерфейсе. Это мой контроллер:

@PostMapping(value = "/upload")
public Mono<String> createFile(@RequestPart(name = "file")Flux<FilePart> files){
    Mono<String> saveImage = nasabahService.createImage(files);

    return saveImage.flatMap(value -> Mono.just(value));

}

Мой вопрос: как я могу получить строку из Mono, возвращенную функцией createImage, чтобы я мог отправить ее клиенту?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 12 ноября 2019

Во-первых, если вы хотите построить реактивную службу, вы должны вернуть объект Mono и позволить пружине использовать SSE (события, отправленные сервером), чтобы доставить строку на фронт неблокирующим способом. В любом случае, я не понимаю, почему вы делаете последнюю плоскую карту, вы можете вернуть saveImage непосредственно из контроллера.

И если вам действительно нужно вернуть строку вместо моно-объекта, вы должны заблокировать ее и получитьрезультат с использованием метода .block () из Mono API

...