Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无阻塞地将单声道转换为Pojo_Java_Spring Webflux_Project Reactor_Web Client - Fatal编程技术网

Java 无阻塞地将单声道转换为Pojo

Java 无阻塞地将单声道转换为Pojo,java,spring-webflux,project-reactor,web-client,Java,Spring Webflux,Project Reactor,Web Client,有没有办法将Mono对象转换为JavaPOJO? 我有一个web客户端连接到第三方REST服务,我没有返回Mono,而是提取该对象并查询它 我找到的所有示例都返回Mono,但我必须得到Pojo本身。目前,我在Pojo上调用block(),但是有没有更好的方法来避免阻塞 块的问题是,在运行了几次之后,它开始抛出一些错误,比如以错误终止的块 public MyPojo getPojo(){ return myWebClient.get() .uri(gen

有没有办法将Mono对象转换为JavaPOJO? 我有一个web客户端连接到第三方REST服务,我没有返回
Mono
,而是提取该对象并查询它

我找到的所有示例都返回Mono,但我必须得到Pojo本身。目前,我在Pojo上调用
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();
        };
    }
public MyPojo getPojo(){
返回myWebClient.get()
.uri(generateUrl())
.Header(createHttpHeaders(headersMap))
.exchange()
.flatMap(evaluateResponseStatus())
.block();
}

私有函数在反应流中阻止对值进行操作不是一个好主意。ProjectReactor为您提供了一系列操作符供您处理流中的对象

在您的情况下,可以编写
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)
}

我强烈建议您查看项目中的Reactor文档。

在反应流中阻止对值进行操作不是一个好主意。ProjectReactor为您提供了一系列操作符供您处理流中的对象

在您的情况下,可以编写
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)
}

我强烈建议您查看项目反应堆文档。

谢谢MuratOzkan。。我会试试的。。虽然我不想返回Mono,但它必须是MyPojo,所以我想我可以在返回之前使用map(pojo->)?如果您能在上下文中添加更多细节,那就太好了。但总的来说,阻塞流不是一个好主意,必须避免。是的,我理解并希望避免阻塞。上下文是获取MyPojo并返回它,而不是返回Mono。MyPojo的一个字段进一步用于在值为null时引发异常。我的意思是,您试图实现什么?通常不需要返回对象,而是使用反应式操作。也许你误解了什么,对吧。。。我将尝试这些操作。非常感谢你的帮助。。我会试试的。。虽然我不想返回Mono,但它必须是MyPojo,所以我想我可以在返回之前使用map(pojo->)?如果您能在上下文中添加更多细节,那就太好了。但总的来说,阻塞流不是一个好主意,必须避免。是的,我理解并希望避免阻塞。上下文是获取MyPojo并返回它,而不是返回Mono。MyPojo的一个字段进一步用于在值为null时引发异常。我的意思是,您试图实现什么?通常不需要返回对象,而是使用反应式操作。也许你误解了什么,对吧。。。我将尝试这些操作。非常感谢你的帮助。