当前位置: 首页 > 知识库问答 >
问题:

为什么我在将mono映射到mono时会收到一个空字符串?

贺季同
2023-03-14

我正在使用Spring WebFlux开发一个API REST,但在上传文件时遇到了问题。它们被存储了,但我没有得到预期的返回值。

我就是这么做的:

  1. 接收通量
  2. 将部件强制转换为文件部件。
  3. 使用transferTo()保存零件(这返回一个单声道 )
  4. 使用文件名将Mono 映射到Mono
  5. 向客户端返回通量
@PostMapping(value = "/muscles/{id}/image")
public Flux<String> updateImage(@PathVariable("id") String id, @RequestBody Flux<Part> file) {
    log.info("REST request to update image to Muscle");
    return storageService.saveFiles(file);
}

存储服务

public Flux<String> saveFiles(Flux<Part> parts) {
    log.info("StorageService.saveFiles({})", parts);
    return
            parts
            .filter(p -> p instanceof FilePart)
            .cast(FilePart.class)
            .flatMap(file -> saveFile(file));
}

private Mono<String> saveFile(FilePart filePart) {
    log.info("StorageService.saveFile({})", filePart);
    String filename = DigestUtils.sha256Hex(filePart.filename() + new Date());
    Path target = rootLocation.resolve(filename);
    try {
        Files.deleteIfExists(target);
        File file = Files.createFile(target).toFile();

        return filePart.transferTo(file)
                .map(r -> filename);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

共有1个答案

佟翰林
2023-03-14

filepart.transferTo()返回mono ,它在操作完成时发出信号-这意味着反应型发布服务器将只发布oncomplete/onerror信号,而在此之前永远不会发布值。

这意味着map操作从未执行过,因为它只是源发布的给定元素。

您可以返回文件的名称,仍然可以使用链式反应运算符,如下所示:

return part.transferTo(file).thenReturn(part.filename());
 类似资料:
  • 我有一个函数返回,我想将它映射到(因为这是我在控制器方法中返回的东西)。 是否有更好的方法返回而不是? 我不能使用,因为映射函数不能接受s。

  • 我对Spring WebFlux和反应编程比较陌生,所以请原谅我的问题是它没有任何意义。 基本上,我想要实现的是用“getRandomPlanetName()”返回一个新行星的名称,同时在Delay对象中设置一个字段“delayElement”。类似这样的事情: 还有,我是否可能只返回一个字符串,它是getPlanetName()的结果,而不是一个对象的单声道?

  • 这是一段代码 这将向控制台提供以下结果: 这意味着第一个中的链被识别为空链。 另一方面,Reactor具有以下类MonoEmpty,该类由Mono返回。empty()方法。除此之外,该方法还包括以下内容: 没有发出任何项,但我用方法发出了类型化对象。 对此有何解释?

  • 我的项目中有一个非常简单的SpringWebFlux restendpoint。 endpoint只需使用提供的用户名回复即可。 我面临的问题是响应体是空的,应该是用户名,我还验证了当我返回硬编码字符串时,它通过了,当我依赖

  • 问题内容: 在非官方指南中有一个占位符答案,带有指向(对我而言)似乎无关的文章的链接。 我使用XJC生成我的JAXB类,尽管它们大多数按预期相互映射,但有些元素被映射到。这对于带有循环的图最令人讨厌,其中有时Foo元素的父节点将是,而它本身没有父属性,从而中断了循环。 我可以想到各种解决方法,但是如果有人可以向我解释这种行为,那就更好了。为什么JAXB有时将元素映射到而不是Foo? 问题答案: 在