如何在Spring 5中从Mono的反应式订阅中调用私有方法并返回特定类型?

时间:2018-07-18 07:22:14

标签: mono spring-webflux

我有一个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关键字置于内部或外部订阅中。

1 个答案:

答案 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到源没有任何意义,而不必返回某些内容。