简体   繁体   English

使用响应式上下文装饰 webclient 响应

[英]Decorate webclient response using reactive context

I'm trying to pass a parameter through the webClient context to understand how the reactive context works.我正在尝试通过 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;
    });

This prints out:这打印出来:

WRITE TEST
SubscriberContext1 DefaultValue
SubscriberContext2 DefaultValue

I'd expect it to be:我希望它是:

WRITE TEST
SubscriberContext1 test
SubscriberContext2 test

Why is the context variable not accessible within the flatMap?为什么在 flatMap 中无法访问上下文变量?

ctx.put creates a new context. ctx.put 创建一个新的上下文。 Changing the code to:将代码更改为:

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

    });

solves it.解决它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM