我有一个main方法,其返回类型为WebClient
。在此方法中,我得到了一个Mono
对象,并使用了预订,我试图调用另一个返回webclient对象的方法。现在在订阅中,我有要返回的webclient对象。由于无法确定如何返回对象以及在何处放置return关键字,因此我在这里被屏蔽了。
主要方法:-
public WebClient getWebClientWithAuthorization(String t) {
-----
----
Mono<AccessToken> accessToken = authenticationProvider.getUserAccessToken(serviceConnectionDetails, queryParams);
Disposable disposable = accessToken.subscribe(
value -> getWebClientBuilder(t, value.getAccessToken()),
error -> error.printStackTrace(),
() -> System.out.println("completed without a value")
);
}
在getWebClientBuilder
方法下面,返回webclient对象:-
private WebClient getWebClientBuilder(String tenantDomain, String accessToken) {
//TODO Logic for Saving the Token using Caching/Redis mechanism will be taken up from here and implemented in future Sprints
logger.info("Bearer token received: "+ CommerceConnectorConstants.REQUEST_HEADER_AUTHORIZATION_BEARER +" "+ accessToken);
if (null != proxyHost) {
return utilsbuilder.baseUrl(tenantDomain).filter(oauth2Credentials(accessToken)).clientConnector(getHttpConnector()).build();
} else {
return utilsbuilder
.baseUrl(tenantDomain)
.filter(oauth2Credentials(accessToken))
.build();
}
}
现在使用getWebClientWithAuthorization
方法,在其中将return关键字置于内部或外部订阅中。
答案 0 :(得分:1)
我认为,使用响应式编程的恒星构建应用程序将任何调用视为异步,从而提供端到端的异步和非阻塞通信时,最重要的是。
因此,我建议您通过以下方式提供Mono<WebClient>
而不是同步类型:
public Mono<WebClient> getWebClientWithAuthorization(String t) {
-----
----
Mono<AccessToken> accessToken = authenticationProvider.getUserAccessToken(serviceConnectionDetails, queryParams);
return accessToken.map(value -> getWebClientBuilder(t, value.getAccessToken()))
.doOnError(error -> error.printStackTrace())
.doOnComplete(() -> System.out.println("completed without a value"))
);
}
因此,现在您可以轻松地将值映射到WebClient
的实例并将其发送到下游。反过来,您的下游可能会对该值做出反应,并将WebClient
转换为HTTP调用的执行,如以下示例所示:
getWebClientWithAuthorization("some magic string here")
.flatMapMany(webClient -> webClient.get()
.uri("some uri here")
.retrieve()
.bodyToFlux(MessageResponse.class))
// operate with downstream items somehow
// .map
// .filter
// .etc
// and return Mono or Flux again to just continue the flow
请记住,如果应该进行异步通信,请继续执行流程,并在所有地方指定反应类型。在遇到某个网络边界或流的某个逻辑端之前,subscribe
到源没有任何意义,而不必返回某些内容。