我们有一个服务器用于获取OAUTH令牌,而且通过WebClient.filter方法将OAUTH令牌添加到每个请求中。
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错误时,会使token失效并再次尝试请求。我的实现方式如下:
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))))
有什么最佳的方法建议来处理这个问题吗? 谢谢
log()
操作符的日志输出吗? - Brian Clozel