java - 无阻塞地将 Mono 转换为 Pojo

标签 java spring-webflux project-reactor web-client

有没有办法将Mono对象转换为java Pojo? 我有一个 Web 客户端连接到第 3 方 REST 服务,而不是返回 Mono我必须提取该物体并询问它。

我找到的所有示例都返回 Mono<Pojo>但我必须得到 Pojo 本身。目前,我正在通过调用 block() 来完成此操作。在 Pojo 上,但是有没有更好的方法来避免阻塞?

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

 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();
        };
    }

最佳答案

阻止对响应式流中的值进行操作并不是一个好主意。 Project Reactor 为您提供了一系列操作符供您处理流中的对象。

在您的情况下,您可以编写 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 方法,我们替换了示例中的整个 evaluateResponseStatus 方法。

您可以像下面这样使用此方法:

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

我强烈建议您查看Transforming an existing sequence在 Project Reactor 文档中。

关于java - 无阻塞地将 Mono 转换为 Pojo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50661553/

相关文章:

java - javax.swing.SwingWorker 中的问题

java - java中如何查找这条语句的行号?

project-reactor - 避免异常导致立即停止 Mono.zip

java - 在 java flux 中按对象属性分组

java - 从 Flux 消费时按顺序调用非阻塞操作,包括重试

java - 用 Java 为树木编写一个基本的 pretty-print

java - 使用 Java 在带有面板的网格中显示 ASCII 的最佳方法是什么?

java - 数据缓冲区限制异常 : Exceeded limit on max bytes to buffer webflux error

java - 如何在 Spring WebFlux @ExceptionHandler 中访问 RequestBody?

java - 如果我在服务器请求正文中有字符串列表并迭代它们,则使正文不断变化