有没有办法将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();
};
}
答案 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。