I have been looking for a solution to the following use case without success, I hope someone can help :
Assuming the following use case. I need to call a customer Api (customerApi
) and this api needs a Bearer
token which may have expired when I call customerApi
. If the token has expired, the customerApi
returns a 401
response.
What, I want to do is to retry only once if I received a 401
and call the method to get a new Bearer
token. If the retry still returns 401
, I need to throw an Exception
The method to get a Bearer
token :
private String getToken() {
return oAuthService.getToken();
}
And the webClient
usage to call customerApi
(customerWebClient
is a bean created with WebClient.Builder
) :
public Customer getCustomerById(String customerId, String token) {
return customerWebClient.get()
.uri("myurl/customers/{customerId}, customerId)
.headers(httpHeaders -> {
httpHeaders.add(HttpHeaders.AUTHORIZATION, "Bearer " + token);
})
.retrieve()
.bodyToMono(Customer.class)
.onErrorResume(WebClientResponseException.NotFound.class, notFound ->
Mono.error(new MyCustomException()))
.block();
}
It seems that retryWhen
can only be used to upgrade timeout. So I hope that someone know how to achieve this use case ^^
Thanks for your help :)
EDIT :
I tried to use retryWhen(Retry.onlyIf(...))
from reactor-extra
but the good old retryWhen
from this package is now deprecated (solution based on : Adding a retry all requests of WebClient)