无法在Java 8中设置实例变量值

时间:2018-08-10 09:47:32

标签: spring-boot java-8 spring-webflux

我有一个类,其中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();

  }

1 个答案:

答案 0 :(得分:0)

Mono.map在将来发出令牌时适用。查看您的代码,如果您没有此令牌,则继续进行是没有意义的。

我的建议是使用以下代码

accessToken.blockOptional().ifPresent(this::setToken); // if you have setToken defined

blockOptional()强制您的代码在继续进行之前等待令牌的可用性。