Spring 在春季Webflux中返回多个Monos

Spring 在春季Webflux中返回多个Monos,spring,reactive-programming,spring-webflux,Spring,Reactive Programming,Spring Webflux,我正在尝试使用Springboot2.0和新的反应式webFlux库。我想知道如何将通过none blocking WebClient进行的两次调用的结果返回给Springboot API的调用方。我的密码是: @RequestMapping("/search") public CombinedResults perfomSearch(@RequestParam final String searchTerm) { Mono<SearchResponse> fasMono =

我正在尝试使用Springboot2.0和新的反应式webFlux库。我想知道如何将通过none blocking WebClient进行的两次调用的结果返回给Springboot API的调用方。我的密码是:

@RequestMapping("/search")
public CombinedResults perfomSearch(@RequestParam final String searchTerm) {
    Mono<SearchResponse> fasMono = searchService.getSearchResults(searchTerm, "fh");
    Mono<SearchResponse> esMono = searchService.getSearchResults(searchTerm, "es");
    CombinedResults combinedResults = new CombinedResults(fasMono, esMono);
    return combinedResults;

}

而不是SearchResponse对象的内容。我觉得我可能错过了一个基本点,这应该是如何工作的!我的想法是,因为WebClient没有阻塞,所以我可以触发对web服务的两个调用中的一个,然后将它们组合起来,而不需要完全的未来等等。

我认为您应该返回表示此操作响应的模型的对象的Mono。假设
CombinedResults
是您的模型。该类应类似于:

public class CombinedResults {

    private SearchResponse fasSearchResponse;

    private SearchResponse esSearchResponse;

    public CombinedResults(final SearchResponse fasSearchResponse, final SearchResponse esSearchResponse) {
        this.fasSearchResponse = fasSearchResponse;
        this.esSearchResponse = esSearchResponse;
    }

    //... getters AND/OR setters
}
在控制器上,您可以执行以下操作:

@RequestMapping("/search")
public Mono<CombinedResults> perfomSearch(@RequestParam final String searchTerm) {
    Mono<SearchResponse> fasMono = searchService.getSearchResults(searchTerm, "fh");
    Mono<SearchResponse> esMono = searchService.getSearchResults(searchTerm, "es");
    Mono<CombinedResults> combinedResults = 
        fasMono
          .flatMap(fh -> esMono.map(es -> new CombinedResults(fh, es)));
    return combinedResults;
}
Mono<SearchResponse> fasMono = searchService.getSearchResults(searchTerm, "fh");
Mono<SearchResponse> esMono = searchService.getSearchResults(searchTerm, "es");
Mono<CombinedResults> results = fasMono.zipWith(esMono, 
    (fas, es) -> {return new CombinedResults(fas, es);});
@RequestMapping(“/search”)
公共Mono性能搜索(@RequestParam final String searchTerm){
Mono-fasMono=searchService.getSearchResults(searchTerm,“fh”);
Mono-esMono=searchService.getSearchResults(searchTerm,“es”);
单组合结果=
法斯莫诺
.flatMap(fh->esMono.map(es->newcombinedresults(fh,es));
返回组合结果;
}
通过这种方式,您将返回一个包含您想要的内容的Mono对象作为响应。带有
esMono.map
的操作链
fasMono.flatMap
在两个Mono发出项目时构建
CombinedResults
。这种组合在尝试将两个Mono合并为一个时非常常见。我想你也可以使用
zip
操作符加入Monos。
所有这些都与WebClient无关。如果您的
getSearchResults
只执行异步非阻塞操作,则所有操作都是异步非阻塞。

Spring WebFlux不支持嵌套的反应式类型。 您应该有如下内容:

@RequestMapping("/search")
public Mono<CombinedResults> perfomSearch(@RequestParam final String searchTerm) {
    Mono<SearchResponse> fasMono = searchService.getSearchResults(searchTerm, "fh");
    Mono<SearchResponse> esMono = searchService.getSearchResults(searchTerm, "es");
    Mono<CombinedResults> combinedResults = 
        fasMono
          .flatMap(fh -> esMono.map(es -> new CombinedResults(fh, es)));
    return combinedResults;
}
Mono<SearchResponse> fasMono = searchService.getSearchResults(searchTerm, "fh");
Mono<SearchResponse> esMono = searchService.getSearchResults(searchTerm, "es");
Mono<CombinedResults> results = fasMono.zipWith(esMono, 
    (fas, es) -> {return new CombinedResults(fas, es);});
Mono-fasMono=searchService.getSearchResults(searchTerm,“fh”);
Mono-esMono=searchService.getSearchResults(searchTerm,“es”);
Mono结果=fasMono.zipWith(esMono,
(fas,es)->{返回新的组合结果(fas,es);};

这似乎给了我相同的输出您是否将combinedresults类更改为不包含反应类型?我认为这是一个更好的答案