biv*_*kil 9 java reactor-netty spring-webflux
我已经使用 Spring Webflux 开始了一个新项目,我对这种反应式编码范式还很陌生。所以对于像新手一样的提问提前道歉。
我的控制器方法返回响应Mono<ResponseEntity<String>>,我有三个不同的服务可以调用,从那里我得到三个不同的Mono对象 -
Mono<CustomObject> customMono = serivce1.method();
Mono<Boolean> booleanMono = service2.method();
Mono<String> stringMono = service3.method();
Run Code Online (Sandbox Code Playgroud)
所以为了准备响应(Mono<ResponseEntity<String>>),我需要做这样的事情 -
Mono.zip(customMono, booleanMono, stringMono, (customData, booleanData, stringData) -> {
------
return Mono.just(ResponseEntity.ok().body("-----"));
});
Run Code Online (Sandbox Code Playgroud)
问题是,没有这样的zip方法将 3Mono和一个函数作为参数。我已经找到了这个 -
https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#zip-reactor.core.publisher.Mono-reactor.core.publisher.Mono-java .util.function.BiFunction-
但它不能满足我的要求。所以我面临的问题
总之,我需要做的是:
Mono<ResponseEntity<String>>使用来自所有服务调用的数据生成最终响应对象 ( )。提前致谢。作为新手,任何建议都值得赞赏。
Rah*_*ede 25
每当您压缩两个单声道时,第三个参数将是BiFunction但带有三个参数,它返回一个flatmapoftuple然后在元组中您将获得其他 Monos 的响应。您需要按以下方式修改您的代码。
Mono.zip(customMono, booleanMono, stringMono).flatMap(data->{
data.getT1();
data.getT2();
data.getT3();
return <your_response_object>;
});
Run Code Online (Sandbox Code Playgroud)
现在getT1(),getT2()和的返回类型是getT3()什么?
主要取决于您的Zip Mono返回的内容。
希望它会帮助你。
对于您的特定情况,您需要Mono.zipWhen()确保您的第 3 个服务调用将具有来自服务调用 1 的响应所需的数据
Mono.zip(monoResponse1,monoResponse2).zipWhen(data ->serviceCall3(data.getT1())).flatMap(response ->{
response.getT1().getT1();//response from mono1
response.getT1().getT2();//response from mono 2
response.getT2();//response from mono 3
return {create your mono response here};
} );
Run Code Online (Sandbox Code Playgroud)