从Webflux的GET操作内部为外部休息服务进行Get&PUT调用

时间:2018-07-26 11:04:00

标签: spring spring-boot reactive-programming spring-webflux project-reactor

我们已经在其余服务中使用WebFlux公开了GET操作。 在此GET操作中,如果单独调用外部Rest服务的GET(或SET)操作,则一切正常。 但是,如果我们尝试在同一操作中合并这两个调用,则代码将失败,它不会对后端服务进行任何调用。 从GET控制器操作调用的服务操作中使用的示例代码为:

public void handleAddress(地图handleAddressRequest)   {       元组4> serviceConnectionDetails = commerceConnectorHelper                 .prepareDataForCheckOutCart(handleAddressRequest);

  serviceConnectionDetails._3
             .get() 
             .uri(CartRequestTranslator.getAddressDetailsEndPoint(serviceConnectionDetails._1, serviceConnectionDetails._2, serviceConnectionDetails._4.get(ServiceOperation.GET_USER_ADDRESSES))) 
             .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML) 
             .retrieve() 
             .bodyToMono(MonoAddressModel.class)
             .map(add -> add.getAddresses())
             .flatMapMany(Flux::fromIterable).filter(defaultAddress -> defaultAddress.isDefaultAddress())
             .flatMap(obj -> {

                 System.out.println("Address default is "+obj.getId());

                 serviceConnectionDetails._3
                 .put()
                 .uri(CartRequestTranslator.putAddressDetailsEndPoint(serviceConnectionDetails._1, serviceConnectionDetails._2, serviceConnectionDetails._4.get(ServiceOperation.GET_USER_ADDRESSES), obj.getId()))
                 .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
                 .exchange()
                 .flatMap(test -> test.bodyToMono(String.class));

                 //returning a dummy flux object
                 return Flux.just("sdsdsd");
             });

   return ;

}

如果任何人都可以在此处共享任何输入,那就太好了。

1 个答案:

答案 0 :(得分:0)

如反应堆参考文档nothing happens until you subscribe中所述。

在您的代码段中,put操作返回的发布者未在管道中链接,因此没有任何订阅。

极大地简化了代码片段以清除细节,它看起来应该更像这样:

Mono<Void> result = webClient
    .get().uri(uri).retrieve()
    .bodyToMono(MonoAddressModel.class)
    .map(model -> model.getAddress())
    .flatMap(address -> {
         return webClient.get().uri(address)
                    .exchange()
                    .then();
    });

如果更复杂的设置(如您的代码段)不起作用,我建议您做几件事:

  • 尝试方法中的重组操作;对于每个步骤都具有显式类型的小型函数,很容易得出结论
  • 尝试在管道的多个位置添加log()运算符;也许过滤器运算符的实现不正确,实际上您正在过滤所有值。