当前位置: 首页 > 知识库问答 >
问题:

将单声道转换为无块的波约

闻慎之
2023-03-14

有没有办法将Mono对象转换为javaPojo?我有一个web客户端连接到第三方REST服务,而不是返回<code>Mono</code>,我必须提取该对象并询问它。

我找到的所有示例都返回Mono

块的问题是,运行几次后,它开始抛出一些错误,例如块终止错误。

 public MyPojo getPojo(){
     return myWebClient.get()
                .uri(generateUrl())
                .headers(createHttpHeaders(headersMap))
                .exchange()
                .flatMap(evaluateResponseStatus())
                .block();
}


private Function<ClientResponse, Mono<? extends MyPojo>> evaluateResponseStatus() {
      return response -> {
            if (response.statusCode() == HttpStatus.OK) {
                return response.bodyToMono(MyPojo.class);
            }
            if (webClientUtils.isError(response.statusCode())) {
                throw myHttpException(response);
                // This invokes my exceptionAdvice
                // but after few runs its ignored and 500 error is returned.
            }
            return Mono.empty();
        };
    }

共有2个答案

山阳辉
2023-03-14

自Webclient以来。不建议使用block(),从传入的httpresponse中检索值的另一种方法是在调用应用程序中创建一个具有必需字段的POJO。然后,一旦收到Mono,就使用Mono。subscribe(),在subscrube中添加一个lambda函数,输入为x,以使用x.getters()检索各个字段。这些值可以打印在控制台上,也可以分配给本地变量进行进一步处理。这有两个方面的帮助:-

  1. 避免可怕的.block()
  2. 拉取大量数据时保持调用异步。这是实现预期结果的许多其他方法之一
柯梓
2023-03-14

阻止在反应式流中对价值进行操作不是一个好主意。项目反应器为您提供了一系列运算符,供您处理流中的对象。

就您的情况而言,您可以编写getPojo()方法,如下所示:

public Mono<MyPojo> getPojo() {
     return myWebClient.get()
            .uri(generateUrl())
            .headers(createHttpHeaders(headersMap))
            .retrieve()
            .onStatus(status -> webClientUtils.isError(status), 
                      response -> Mono.error(myHttpException(response))
            .bodyToMono(MyPojo.class)
}

请注意,使用 onStatus 方法,我们在您的示例中替换了整个评估响应状态方法。

您可以按如下方式使用此方法:

// some method
...
getPojo()
    .map(pojo -> /* do something with the pojo instance */)
...

我强烈建议你在Project Reactor文档中考虑转换一个现有的序列。

 类似资料:
  • 使用spring 5,对于reactor,我们有以下需求。 什么方法可以转换单声道

  • 我在玩r2dc for spring boot java应用程序。 我在想,如果可能的话,可以把通量转换成Mono来进行某种计算。 伪示例:

  • 我有一个方法,可以尝试使用WebClient返回Mono 它可以返回我期望的结果。然后我尝试创建另一个方法来支持列表作为参数 但这一次返回一个奇怪的结果。 我是反应式编程新手,将流和单声道结合起来,然后转换为流量的正确方法是什么?

  • 我想在不使用block()/blockFirst()/blockLast()的情况下将mono转换为对象java。请告诉我如何转换它。

  • 我有一个服务电话返回单声道。现在,在给用户提供API响应的同时,我想发送一些响应。我试过用flatMap和地图,但它不起作用。它给了我一个空的身体作为回应。 谢谢你

  • 问题内容: 我在这里遇到以下问题:我得到了一个代表音频数据的字节块(uint16_t *),并且生成它们的设备正在捕获单声道声音,因此很明显,我在1通道上具有单声道音频数据。我需要将此数据传递到另一台设备,该设备需要交错的立体声数据(因此为2个通道)。我要做的基本上是复制数据中的1通道,以便立体声数据的两个通道都包含相同的字节。您能指出一个有效的算法吗? 谢谢,f。 问题答案: 如果只需要交错的立