【问题标题】:Decorate webclient response using reactive context使用响应式上下文装饰 webclient 响应
【发布时间】: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


【解决方案1】:

ctx.put 创建一个新的上下文。将代码更改为:

 .subscriberContext(ctx -> {
        System.out.println("WRITE TEST");
        return ctx.put("test", "test");

    });

解决了。

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 2018-07-11
    • 1970-01-01
    • 2021-01-08
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2017-05-27
    相关资源
    最近更新 更多