我试图将上下文从一个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
中的Flux
或Mono
联系在一起,因此你可以在控制器中读取上下文。