无阻塞地将 Mono 转换为 Pojo

No_*_*One 2 java web-client project-reactor spring-webflux

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

我找到的所有示例都返回了,Mono<Pojo>但我必须获得 Pojo 本身。目前,我通过调用block()Pojo 来做到这一点,但有没有更好的方法来避免阻塞?

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

 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();
        };
    }
Run Code Online (Sandbox Code Playgroud)

Mur*_*kan 7

阻止对响应流中的值进行操作不是一个好主意。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)
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用onStatus方法,我们替换了evaluateResponseStatus示例中的整个方法。

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

// some method
...
getPojo()
    .map(pojo -> /* do something with the pojo instance */)
...
Run Code Online (Sandbox Code Playgroud)

我强烈建议您在 Project Reactor 文档中查看转换现有序列