Mono<Void>.flatMap 返回 Mono 时不会被调用<Something>

问题描述 投票:0回答:1

我是 WebFlux 的新手。开发文件上传API。我想将上传的文件和元保存到数据库并返回保存的实体作为响应。 lambda 表达式未在

flatMap
上的
filePart.transferTo
中调用。我觉得使用
block()
会让使用 WebFlux 变得毫无意义。如有任何建议,我们将不胜感激。

public Mono<Music> uploadMusic(FilePart filePart) throws IOException {
    File file = File.createTempFile("tmp-", filePart.filename());
    file.deleteOnExit();
    Music music = new Music();
    return filePart.transferTo(file).flatMap((it) -> {
        music.setFilePath(file.getAbsolutePath());
        music.setMeta(new Metadata());
        log.info(String.valueOf(music));
        return this.musicRepository.save(music);
    });
}

当我进行片段测试时,我发现

Mono<Void>
.flatMap 返回
Mono<SomeObj>
似乎是问题所在。

// Lambda expression not invoked
public Mono<Music> voidToObj(FilePart filePart) throws IOException {
    Music music = new Music();
    return Mono.just(music).then().flatMap(it -> {
        music.setMeta(new Metadata());
        log.info(music.toString());
        return Mono.just(music);
    });
}

// Lambda expression invoked
public Mono<Music> objToObj(FilePart filePart) throws IOException {
    Music music = new Music();
    return Mono.just(music).flatMap(it -> {
        music.setMeta(new Metadata());
        log.info(music.toString());
        return Mono.just(music);
    });
}
java file-upload spring-webflux
1个回答
0
投票

Mono<Void>
不会产生值,因为 Void 不是对象。基本上它与空的 Mono 相同,只是在没有任何实际元素的情况下完成。

根据文档https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html

Mono 应该用于刚刚完成但没有任何价值的 Publisher。

因此,

flatMap
以及任何其他应该处理值的方法,永远不会在
Mono.just(music).then().flatMap
之后被调用。

© www.soinside.com 2019 - 2024. All rights reserved.