0

例如,假设我有一个 WebFilter,它写了一些 Context

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")));
}

以上所有工作正常。

如果我想从控制器方法返回一个 Single 怎么办?我尝试使用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。这是正确的解释吗?

有没有办法在传入 Context 时返回 Single ?

4

1 回答 1

2

订阅本身工作正常。问题是这Context是一个 Reactor 特定的特性,它不是Reactive Streams标准的一部分。因此,当您将 a 转换为MonoSingle, theContext会丢失。

在您附加的代码中,您应该简单地省略 Rx 部分以使其工作,但我想您的真实世界用例可能会更加复杂。一个好的方法是尽早将 Rx 代码转换为 Reactor(例如,当您调用返回 Rx 类型的第三方库时)并在代码库的其余部分(包括控制器返回类型)中使用 Reactor。

于 2021-04-02T14:58:37.250 回答