使用 webflux 在另一个中设置一个单声道

Posted

技术标签:

【中文标题】使用 webflux 在另一个中设置一个单声道【英文标题】:Setting one mono within another using webflux 【发布时间】:2021-07-14 21:40:35 【问题描述】:

我正在从 mongo db 中检索发布者 Mono<ProductOrder>

我有另一个发布者Mono<CommandResponse>

我想将ProductOrder 对象设置为CommandResponse,因为它是该类的一部分。喜欢commandResponse.setProductOrder(po instance)

CommandResponse 除了ProductOrder 实例之外,还将有不同的MonoString or Int

最后想返回Mono<ServerResponse>,其中包含CommandResponse的正文

我无法将Mono<ProductOrder> 对象设置为Mono<CommandResponse>

请帮忙。谢谢。


代码片段

@Component
public class Handler 


    @Autowired
    private MongoService service;

    public Mono<ServerResponse> get(ServerRequest request) 
        Mono<ProductOrder> p = service.queryById();
        
        

> Here, in the return statement i want to return Mono<CommandResponse> 
> instead of Mono<ProductOrder> in the response body
> remember: CommandResponse has a reference to ProductOrder

        return 
            ServerResponse.ok()
                .contentType(MediaType.APPLICATION_JSON)
                .body(p, ProductOrder.class).map(null);
        );
    

【问题讨论】:

如果您可以添加实际代码 sn-p,您将有更好的机会获得帮助。 在上面添加了代码sn-p 【参考方案1】:
Mono<CommandResponse> commandMono = ... // I don't how it is set 
Mono<ProductOrder> productMono = service.queryById();
Mono.zip(commandMono, productMono)
  .map(tuple ->  
    var command = tuple.getT1();
    var product = tuple.getT2();
    command.setProductOrder(product) // => .setProductOrder(po instance)
    return command;
  )
  .flatMap(command -> ServerResponse.ok()
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(command)
  )

我还没有运行这段代码,所以我不确定它是否可以编译,但是有了它你应该能够弄清楚你的代码是如何工作的

【讨论】:

非常感谢。 @sawim

以上是关于使用 webflux 在另一个中设置一个单声道的主要内容,如果未能解决你的问题,请参考以下文章

Spring webflux:从请求中消耗单声道或通量

如何使用 WebFlux 在 Spring Boot 2 中设置登录页面?

在 Spring WebFlux webclient 中设置超时

如何使用WebFlux在Spring Boot 2中设置登录页面?

如何组合两个或多个参数化的 Monos Webflux 最佳实践

使用 presentViewController 方法在另一个 VC 中设置属性