【问题标题】:Unable to set instance variable value in Java 8无法在 Java 8 中设置实例变量值
【发布时间】:2019-01-17 21:40:32
【问题描述】:

我有一个类,其中 token 是它的实例变量。我正在使用 Spring 5-reactive、Java 8 和 SpringBoot2。我正在调用令牌服务并获取 Mono 并将 Mono 的属性 (accessToken) 传递给另一个名为 getToken() 的方法,使用 map 并尝试设置到此实例变量“token”中。 当我按如下方式记录此实例变量的值时:-

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();

  }

【问题讨论】:

  • getToken 对于设置令牌的方法来说是一个非常具有误导性的名称...

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


【解决方案1】:

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

我的建议是使用以下代码

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

blockOptional() 强制您的代码等待令牌的可用性,然后再继续。

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2021-09-01
    • 2010-10-18
    • 2018-11-13
    • 2018-03-01
    • 2023-04-03
    相关资源
    最近更新 更多