当前位置: 首页 > 知识库问答 >
问题:

如何在WebFlux控制器中订阅

任昊苍
2023-03-14

在REST控制器中,我需要调用REST以获取一个值,用作第二次REST调用的URI变量。

@PostMapping
public void abbina(@RequestBody DocumentsUploadRequest documentsUploadRequest) {

  Mono<GetResult> result = WebClient
      .create(url)
      .get()
       .....
      .retrieve()
      .bodyToMono(GetResult.class)
      ;

  WebClient.post()
      .uri(...)
      .path("/{partita}")
      .build(result.block().getValue()))
      .....
      .bodyToMono(PostResult.class)
   ....
}

问题是在WebFlux REST中不可能调用mono/flux上的块。

代码抛出

Java . lang . illegalstateexception block()/block first()/block last()正在阻塞,这在线程反应器中是不支持的-http

我试图改变

. build(result.block(). getValue()))

。build(result.share()。阻止()。getValue()))

但现在的问题是< code>result.share()。block()无限期挂起。

共有1个答案

邓卓
2023-03-14

首先,切勿阻塞反应式管道。您应该改为订阅。在这种特殊情况下,只要您提供发布者,Spring Webflux框架就会为您订阅。为此,控制器方法必须像这样返回 Mono 发布者:

@PostMapping
public Mono<Void> abbina(@RequestBody Attribute documentsUploadRequest) {

}

在这里,Mono

然后,您必须构建一个没有阻塞的反应式管道。

第一个HTTP调用的结果是GetResultMono:

private Mono<GetResult> getResult() {
    return WebClient
            .get()
            //...
            .retrieve()
            .bodyToMono(GetResult.class);
}

同样,第二个 HTTP 调用返回一个道的后结果

private Mono<PostResult> postResult(String firstResult) {
    return WebClient
            .post()
            //...
            .retrieve()
            .bodyToMono(PostResult.class);
}

最后,将这两个发布者结合起来,以便使用平面地图运算符构建您的管道:

@PostMapping
public Mono<Void> abbina(@RequestBody Attribute documentsUploadRequest) {
    return getResult()
            .flatMap(result -> postResult(result.getValue()))
            .then();
}

我建议查看以下指南:构建反应式RESTful Web服务

 类似资料:
  • 有一个由 方法以编程方式创建的 flux: 有一个rest控制器: 有几个web客户端(在独立的进程中): JavaScript中有几个EventSource实例: 只有前两个“订户”将开始接收消息(不管它是web客户端还是EventSource实例)。另一个将打开连接,获取HTTP 200状态,但是事件流保持为空。客户端和服务器端都没有错误。 我不明白,对“2个订阅者”的限制在哪里。如果我想支持

  • 我在我的控制器中使用javax验证,带有。当服务器接收到无效数据时,它会抛出错误,但我想处理该错误并返回自定义格式的错误。我无法在控制器建议中捕获异常。我使用的是Spring webFlux,因此无法使用bindingResult。我如何处理该异常?这是我的代码 控制器 资源 错误处理程序

  • 如果运行在负载均衡器之后,最好应该理解头。因此,在本例中,我想让类似于。如果需要的话,我将使用Netty服务器实现。

  • 问题内容: 我写了一个过滤器函数,它将根据您传递的参数返回数据。我希望控制器具有相同的功能。是否可以在控制器中重用过滤器功能? 到目前为止,这是我尝试过的: 问题答案: 将 $ filter 注入控制器 然后,无论您想在哪里使用该过滤器,都可以像这样使用它: 如果要将参数传递给该过滤器,请使用单独的括号进行处理: 您要过滤的数组在哪里,并且是用于过滤的对象。

  • 我很难理解mono 的用法。请问这个Mono 能给Mono带来什么样的好处? 谢谢。

  • 来自。NET和Node的我真的很难弄清楚如何将这个阻塞的MVC控制器转移到一个非阻塞的WebFlux注释控制器?我已经理解了这些概念,但是没有找到合适的异步Java IO方法(我希望返回一个Flux或Mono)。