无法在 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 中设置实例变量值的主要内容,如果未能解决你的问题,请参考以下文章