将上下文从一个Mono传递到另一个Mono - Context为空



我试图将上下文从一个Mono传递到另一个,然后访问它,但显然我做错了。谢谢你

Mono<String> hello = Mono.just("Empty").subscriberContext(ctx -> ctx.put("message","hellooooo"));
 
Mono<String> world = Mono.subscriberContext().map( ctx -> (String)ctx.get("message"));
world.subscribe(s -> System.out.println("n Monos content: " + s));

我得到的错误是:

reactor.core.Exceptions$ErrorCallbackNotImplemented: java.util.NoSuchElementException: Context is empty
Caused by: java.util.NoSuchElementException: Context is empty
    at reactor.util.context.Context0.get(Context0.java:42) ~[reactor-core-3.4.14.jar:3.4.14]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Assembly trace from producer [reactor.core.publisher.MonoMapFuseable] :
    reactor.core.publisher.Mono.map(Mono.java:3411)
...

正如评论中提到的,这是因为它们不在同一个反应流中。但是,当我实现自己的过滤器(实现WebFilter)并返回:

时,如何传递上下文?
return webFilterchain.filter(exchange).subscriberContext(c->c.put("key","value-key"));

在此之后,上下文在任何控制器中都是可见的,就像这样:

Mono<String> parameter= Mono.subscriberContext().map(s->s.get("key")); 

发生了什么,上下文现在在我的参数变量中可见?在文档中,我可以看到,WebFilterChain中的filter方法做了一些特殊的委托,将上下文委托给链中的下一个WebFilter。但不确定发生了什么,它在我的自定义参数中是可见的mono。上下文是如何传递的,我是否也可以对我的自定义响应流做类似的事情?

正如其他人在评论中所述,在您的示例中,您正在创建两个完全断开连接的Mono。一个写入其上下文中,另一个从(默认的,即。空的)上下文。

Context只有当读写步骤是单个操作符反应链的一部分时才可访问。

Spring WebFlux确保了这种情况,即只要你在webFilterChain中做委托,Spring确保你应用的操作符是单个链的一部分,该链将底部的请求/订阅和顶部的@Controller中的FluxMono联系在一起,因此你可以在控制器中读取上下文。

最新更新