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

Posted

技术标签:

【中文标题】无法在 Java 8 中设置实例变量值【英文标题】:Unable to set instance variable value in 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 对于设置令牌的方法来说是一个非常具有误导性的名称... 【参考方案1】:

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

我的建议是使用以下代码

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

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

【讨论】:

以上是关于无法在 Java 8 中设置实例变量值的主要内容,如果未能解决你的问题,请参考以下文章

如何在emacs组织模式中设置变量值?

JAVA环境变量的配置

在java中获取环境变量值

设置方法或构造函数

jdk环境变量配置

JAVA_HOME 变量未在 Windows 中设置 [重复]