我们已经在其余服务中使用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 ;
}
如果任何人都可以在此处共享任何输入,那就太好了。
答案 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()
运算符;也许过滤器运算符的实现不正确,实际上您正在过滤所有值。