у нас есть сервер для получения токена OAUTH, и токен oauth добавляется к каждому запросу с помощью метода WebClient.filter, например,
webClient
.mutate()
.filter((request, next) -> tokenProvider.getBearerToken()
.map(token -> ClientRequest.from(request)
.headers(httpHeaders -> httpHeaders.set("Bearer", token))
.build()).flatMap(next::exchange))
.build();
TokenProvider.getBearerToken returns Mono<String> since it is a webclient request (this is cached)
Я хочу иметь функцию повтора, которая при ошибке 401 будетсделать токен недействительным и повторить запрос. У меня это работает вот так
webClient.post()
.uri(properties.getServiceRequestUrl())
.contentType(MediaType.APPLICATION_JSON)
.body(fromObject(createRequest))
.retrieve()
.bodyToMono(MyResponseObject.class)
.retryWhen(retryOnceOn401(provider))
private Retry<Object> retryOnceOn401(TokenProvider tokenProvider) {
return Retry.onlyIf(context -> context.exception() instanceof WebClientResponseException && ((WebClientResponseException) context.exception()).getStatusCode() == HttpStatus.UNAUTHORIZED)
.doOnRetry(objectRetryContext -> tokenProvider.invalidate());
}
Есть ли способ перенести это в функцию webClient.mutate () ..... build ()?так что все запросы будут иметь эту возможность повторения?
Я пытался добавить в качестве фильтра, но, похоже, он не работал, например
.filter(((request, next) -> next.exchange(request).retryWhen(retryOnceOn401(tokenProvider))))
какие-либо предложения о наилучшем способе подойти к этому?Привет