【发布时间】:2020-08-05 19:48:46
【问题描述】:
我正在尝试通过 webClient 上下文传递参数以了解反应式上下文的工作原理。
.post()
.uri(uri)
.headers(httpHeaders -> httpHeaders.putAll(headers))
.body(BodyInserters.fromObject(payload))
.exchange()
.flatMap( s -> Mono.subscriberContext()
.map( ctx -> {
System.out.println(“SubscriberContext1 " + ctx.getOrDefault("test", "DefaultValue”));
return s;
}))
.flatMap(resp -> {
return resp
.bodyToMono(Object.class)
.defaultIfEmpty(new HashMap<>())
.map(body -> {
//I would like to access the context variable here
return doSomething(body, contextVariable);
});})
.flatMap( s -> Mono.subscriberContext()
.map( ctx -> {
System.out.println("SubscriberContext2” + ctx.getOrDefault("test", "DefaultValue”));
return s;
}))
.subscriberContext(ctx -> {
System.out.println("WRITE TEST");
ctx.put("test", "test");
return ctx;
});
打印出来:
WRITE TEST
SubscriberContext1 DefaultValue
SubscriberContext2 DefaultValue
我希望它是:
WRITE TEST
SubscriberContext1 test
SubscriberContext2 test
为什么在 flatMap 中无法访问上下文变量?
【问题讨论】:
-
尝试将
ctx.put("test", "test");放在第一个flatMap -
这也不起作用,但让我意识到问题出在哪里。 ctx.put 创建一个全新的上下文。更改订阅者上下文以返回它(return ctx.put("test", "test");) 解决了这个问题。
-
哇,太棒了
标签: spring-webflux project-reactor