Как использовать Flatmap в ExchangeFilterFunction для Webclient? - PullRequest
0 голосов
/ 05 мая 2019

Я хочу использовать ExchangeFilterFunction, чтобы проверить код состояния, чтобы узнать, не истек ли токен.Если это так, я получу новый токен и повторите запрос.Однако, когда я запускаю код, refreshToken () просто бесконечно зацикливается и никогда не возвращает фактический токен.

    private ExchangeFilterFunction errorHandlingFilter() {
        return (request, next) -> next.exchange(request)
                .flatMap((Function<ClientResponse, Mono<ClientResponse>>) clientResponse -> {
                    if (clientResponse.statusCode().value() == expired code) {

                        return refreshToken().flatMap(token -> {
                            log.info("THE TOKEN IS: " + token.getAccess_token());
                            ClientRequest retryRequest = ClientRequest.from(request)
                                    .header("Authorization", "Bearer " + token.getAccess_token()).build();
                            return next.exchange(retryRequest);
                        });

                    } else {
                        return Mono.just(clientResponse);
                    }
                });
    }
 private Mono<TokenData> refreshToken() {

        log.info("Calling to refresh token");

        return webClient.post()
                .uri("someURL")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                .header("Authorization", "Basic something")
                .accept(MediaType.APPLICATION_JSON)
                .body(
                        BodyInserters.fromFormData("grant_type", "something")
                                .with("username","someusername")
                                .with("password","somepass")
                )
                .exchange()
                .flatMap( response -> {
                    log.info("THE TOKEN CODE IS: " + response.getAccess_token());

                    return response.bodyToMono(TokenData.class);
                })
                .switchIfEmpty(Mono.error(new Exception()));
    }

В журнале показывается:

Вызов для обновления токена

Вызов для обновления токена

Вызов для обновления токена

Вызов для обновления токена

Вызов для обновления токена

...

он никогда не достигнет «КОДА ТОКЕНА»:

Функция refreshToken работает нормально, если я перевожу вызов из функции ExchangeFilterFunction, но он мне нужен там, поскольку он является перехватчиком для обновления токена и запроса на повторную попытку..

...