无阻塞地将Mono转换为Pojo

时间:2018-06-02 22:07:28

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

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

我找到的所有示例都返回Mono<Pojo>,但我必须得到Pojo本身。目前,我是通过在Pojo上调用block()来实现的,但是有更好的方法可以避免阻塞吗?

该块的问题是,在几次运行之后,它会开始抛出一些错误,例如块Terminated with error。

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

1 个答案:

答案 0 :(得分:3)

阻止在反应流中操作值不是一个好主意。 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 */)
...

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