Украсить ответ веб-клиента, используя реактивный контекст - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь передать параметр через контекст 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?

1 Ответ

0 голосов
/ 23 апреля 2020

ctx.put создает новый контекст. Изменение кода на:

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

    });

решает его.

...