我有一个类,其中token是它的实例变量。我正在使用 Spring 5-reactive,Java 8和SpringBoot2 。我正在调用令牌服务并获取Mono,然后使用map尝试将Mono的属性( accessToken )传递到另一个名为 getToken()的方法中将此变量设置为“ 令牌”。 当我记录该实例变量的值时,如下所示:-
logger.info("Verifying Token: "+ token);
我越来越空了。我相信由于异步反应编程,此日志记录语句将在我对getToken()的方法调用之前首先执行。请协助我先将该属性设置为该实例变量,然后再执行其余的语句,因为我是反应式编程的新手,并且仍在学习它。
private String token;
public ExchangeFilterFunction getNewExchangeFilter(Tuple2 <String, WebClient> serviceConnectionDetails,
MultiValueMap <String, String> queryParams) {
logger.info("Calling auth server to get new access token..................");
Mono<AccessToken> accessToken = commerceAccessTokenService.getUserAccessToken(serviceConnectionDetails, queryParams);
accessToken.map(token -> getToken(token.getAccessToken()));
logger.info("Verifying Token: "+ token);
return (clientRequest, exchangeFunction) -> exchangeFunction.exchange(ClientRequest.from(clientRequest)
.header("Authorization", "Bearer " + token)
.build());
}
private Mono<AccessToken> getToken(String token){
logger.info("Get Token: "+ token);
this.token = token;
return Mono.empty();
}
答案 0 :(得分:0)
Mono.map
在将来发出令牌时适用。查看您的代码,如果您没有此令牌,则继续进行是没有意义的。
我的建议是使用以下代码
accessToken.blockOptional().ifPresent(this::setToken); // if you have setToken defined
blockOptional()
强制您的代码在继续进行之前等待令牌的可用性。