我是 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);
});
}
Mono<Void>
不会产生值,因为 Void 不是对象。基本上它与空的 Mono 相同,只是在没有任何实际元素的情况下完成。
根据文档https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html
Mono 应该用于刚刚完成但没有任何价值的 Publisher。
因此,
flatMap
以及任何其他应该处理值的方法,永远不会在Mono.just(music).then().flatMap
之后被调用。