Я хочу использовать 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, но он мне нужен там, поскольку он является перехватчиком для обновления токена и запроса на повторную попытку..