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

为什么上下文不从(Reactor)Mono传播到(RxJava)Single?

魏凯捷
2023-03-14

例如,假设我有一个WebFilter,它可以编写一些上下文

public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
  return chain.filter(exchange)
    .contextWrite(Context.of("my-context", "foobar"));
}

下游,我的控制器这样做

@GetMapping(path = "test")
public Mono<String> test() throws Exception {
  final Mono<ContextView> contextMono = Mono.deferContextual(Mono::just);
  return contextMono.flatMap(ctx -> Mono.just(ctx.get("my-context")));
}

以上各项都很好。

如果我想从controller方法返回一个值呢?我尝试使用RxJava3Adapter。monoToSingle()但它会破坏反应器链。

@GetMapping(path = "test")
public Single<String> test() throws Exception {
  final Mono<ContextView> contextMono = Mono.deferContextual(Mono::just);
  return RxJava3Adapter.monoToSingle(
    contextMono.flatMap(ctx -> Mono.just(ctx.get("my-context"))));
}

我的猜测是,因为我不返回Mono,所以RxJava3Adapter中没有订阅此ContextMono。这是正确的解释吗?

有什么方法可以在传入上下文的同时返回单个?

共有1个答案

冀子石
2023-03-14

订阅本身工作正常。问题在于,上下文是反应器特有的特性,不属于反应流标准的一部分。因此,当您将Mono转换为Single时,上下文将丢失。

在您附加的代码中,您只需省略Rx部分即可使其工作,但我认为您的实际用例可能更复杂。一个好的方法是尽早将Rx代码转换为Reactor(例如,当您调用返回Rx类型的第三方库时),并在代码库的其余部分(包括控制器返回类型)使用Reactor。

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

  • 使用阻塞运算符,我可以这样做:

  • 假设我有以下流程 只是为了理解 因此,我有 但我需要 继续皱眉 这个问题有什么好的解决办法吗?

  • 问题内容: 经过一整天的研究和尝试,我终于放弃了 纯AJAX的 上传文件(ps:本文如何与JQuery异步上传文件?埋了我的最后希望) 我的问题可能没什么意义,但是我仍然想知道为什么ajax(或XMLHttpRequest)不能处理这个问题?为什么文件不能像真正的httprequest那样传输? 问题答案: 出于安全原因,JavaScript无法读取本地文件,因此我们无法使用AJAX发送数据。 但

  • 我不知道这是与代码有关还是与服务器有关... 在一个PHP页面上,我调用了一个包含标准PHP上传过程的上传函数。在调用函数之后,我执行重定向(尝试使用window.location或header())。 奇怪的是,每件事都运行良好的几次,然后它就不会再上传了(uploadOK也不会是0)。它不会将文件移动到服务器上。 然后,我将取出重定向,上传将重新开始工作。我把重定向放回去,上传还能工作几次,然

  • 我使用dropwizard制作了一个非常传统的文件上传方法。 所以我在资源中有一个这样的方法 里面没有什么特别的,它只是保存到一个路径,使用java.nio库,就像这样 它只是不会上传excel文件。我在其他地方读到excel文件和它们的底层类型受到怀疑。请问我需要做什么?