我是WebFlux的新手.开发文件上传API.我想将上传的文件和元数据保存到数据库中,并将保存的实体作为响应返回.在filePart.transferToflatMap中未调用lambda表达式.我觉得使用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>0.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是not an object.基本上它和空的Mono一样,它只是在没有任何实际元素的情况下完成.

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

对于刚刚完成但没有任何值的出版商,应使用mono<;void>;.

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

但是如果你只是想更新并返回你已经拥有的值,那么你可以这样做:

return filePart.transferTo(file).then(Mono.defer(() -> {
    music.setFilePath(file.getAbsolutePath());
    music.setMeta(new Metadata());
    log.info(String.valueOf(music));
    // assuming .save returns a publisher
    return this.musicRepository.save(music);
});

Java相关问答推荐

Android -如何修复Java.time.zone. ZoneRulesExcept:未知时区ID:Europe/Kyiv

如何将kotlin代码转换为java

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

如何修复IndexOutOfBoundsException在ClerView适配器的onRowMoved函数?

具有多种令牌类型和段的复杂Java 17正则表达式

Spring Boot Maven包

MySQL数据库中未应用具有Spring数据的唯一约束

%This内置函数示例

Spring-Boot Kafka应用程序到GraalVM本机映像-找不到org.apache.kafka.streams.processor.internals.DefaultKafkaClientSupplier

如果按钮符合某些期望,如何修改它的文本?

使用Class.this.field=Value初始化构造函数中的最后一个字段会产生错误,而使用this.field=Value则不会

在JDK Flight Recorder中只记录单个线程

除0错误/抱歉我的句子是PT

在一行中检索字符分隔字符串的第n个值

根据应用程序 Select 的语言检索数据

无法在Java中获取ElastiCache的AWS CloudWatch指标

如何以事务方式向ibmmq发送消息

无泄漏函数的Java DRY

";重复键的值提示唯一约束«;livre_genre_pkey»";例外

如何在Java中正确实现填字游戏求解器