将上下文从一个 Mono 传递到另一个 - 上下文为空
Passing Context from one Mono to another - Context is empty
我正在尝试将上下文从一个 Mono 传递到另一个 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)
...
如评论中所述,这是因为它们不在同一个反应流中。
但是然后-当我实现自己的 Filter(implements WebFilter) 和 return:
时如何传递上下文
return webFilterchain.filter(exchange).subscriberContext(c->c.put("key","value-key"));
在此之后,上下文在任何控制器中都是可见的,就像这样:
Mono<String> parameter= Mono.subscriberContext().map(s->s.get("key"));
发生了什么事,该上下文现在在我的参数变量中可见?
在我看到的文档中,WebFilterChain 中的过滤器方法对上下文“委托给链中的下一个 WebFilter”进行了一些特殊委托。但不确定,它在我的自定义“参数”单声道中可见是怎么回事。上下文是如何传递的,我也可以对我的自定义反应流做类似的事情吗?
正如其他人在评论中所述,在您的示例中,您正在创建两个完全断开连接的 Mono
。一个 将 写入其上下文,一个 从(默认,即空)上下文 读取 。
仅当读取和写入步骤是单个反应式运算符链的一部分时,才可访问上下文。
Spring WebFlux 确保情况如此,即只要您在 webFilterChain 中进行委托,Spring 确保您应用的运算符是连接请求的单个链的一部分/ 底部的订阅和顶部 @Controller
中的 Flux
或 Mono
,因此您可以读取控制器内部的上下文。
我正在尝试将上下文从一个 Mono 传递到另一个 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)
...
如评论中所述,这是因为它们不在同一个反应流中。 但是然后-当我实现自己的 Filter(implements WebFilter) 和 return:
时如何传递上下文return webFilterchain.filter(exchange).subscriberContext(c->c.put("key","value-key"));
在此之后,上下文在任何控制器中都是可见的,就像这样:
Mono<String> parameter= Mono.subscriberContext().map(s->s.get("key"));
发生了什么事,该上下文现在在我的参数变量中可见? 在我看到的文档中,WebFilterChain 中的过滤器方法对上下文“委托给链中的下一个 WebFilter”进行了一些特殊委托。但不确定,它在我的自定义“参数”单声道中可见是怎么回事。上下文是如何传递的,我也可以对我的自定义反应流做类似的事情吗?
正如其他人在评论中所述,在您的示例中,您正在创建两个完全断开连接的 Mono
。一个 将 写入其上下文,一个 从(默认,即空)上下文 读取 。
仅当读取和写入步骤是单个反应式运算符链的一部分时,才可访问上下文。
Spring WebFlux 确保情况如此,即只要您在 webFilterChain 中进行委托,Spring 确保您应用的运算符是连接请求的单个链的一部分/ 底部的订阅和顶部 @Controller
中的 Flux
或 Mono
,因此您可以读取控制器内部的上下文。