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

ReactJs UI中的Spring webflux数据

茅高卓
2023-03-14

我正在玩spring WebFlux。我已经创建了一个项目,该项目将监听mongo封顶的集合,并在数据到达时返回数据流量。
我正在我的repository方法中使用@tailable

我的控制器看起来像这样

@GetMapping("/findall")
  public Flux<Product>> findAll() {
    return productRepository.findAllProducts().;
 }

一切正常。我通过添加一个doOnNext(...)对此进行了测试,每当有一个新项目添加到我的capped集合中时,doOnNext中的consumer就会被执行。

现在我想让这个显示在浏览器上。我想用ReactJs(我对前端是全新的)。

到目前为止,我还没有找到任何方法在浏览器中显示通量数据。我有什么办法可以做到这一点。

我试过这样的SSE(服务器发送的事件)

 componentDidMount() {
   this.eventSource = new EventSource('http://localhost:8080/findall');
   this.eventSource.addEventListener('product', (data) => {
            let json = JSON.parse(data.data)
            this.state.products.push(json.name)
            this.setState ( {
                products : this.state.products
            })
        });
 }

这工作起来非常好,但要使其工作,我必须像这样更改服务器端代码

 @GetMapping("/findall")
  public Flux<ServerSentEvent<Product>> findAll() {
    return productRepository.findAllProducts().map(data -> ServerSentEvent.<Product>builder().event("product").data(data).build());
  }

在我看来,这有点紧密耦合,因为UI应该知道要监听的事件类型('product')。

有没有其他方法可以从UI端处理事件流(特别是使用reactjs)?

共有1个答案

司空瑾瑜
2023-03-14

您不应该为了将数据流化到浏览器而更改控制器。下面的代码段应该可以工作:

@GetMapping(path="/findall", produces=MediaType.TEXT_EVENT_STREAM_VALUE)
@ResponseBody
public Flux<Product>> findAll() {
    return productRepository.findAllProducts();
}

如果您想查看完整的工作示例,您可以在本研讨会和本示例应用程序中看到该功能。

 类似资料:
  • 我的理解是单声道 我说得对吗? 如果没有,单声道之间的区别是什么

  • 请查看以下使用RestTemplate的controller代码(添加注释): 现在,我正试图通过反应式编程实现同样的目标。我现在使用WebFlux中的WebClient和Mono。但是,我很困惑如何将结果结合起来?看一看下面的代码(在任何地方都使用Mono,其余代码保持不变) 问题1:我们如何整合一切,形成一个Mono对象,并将其作为响应发送出去? 问题2:“CourseInfo CourseI

  • 在https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/kotlin/org/springframework/context/support/BeanDefinitionDsl.kt该注释显示了如何通过新的“函数bean定义Kotlin DSL”定义SpringBean。我还发

  • 我希望为每个请求生成唯一的traceId,并将其传递给所有服务。在SpringMVC中,使用MDC上下文并将traceId放在头文件中相当容易,但在反应式堆栈中,由于ThreadLocal,它根本不起作用。 一般来说,我希望使用单个traceId记录我拥有的每个服务上的每个请求和响应,该traceId可以识别整个系统中的特定操作。 我试图根据文章创建自定义过滤器:https://azizulhaq

  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • 我正在使用SpringWebSockets,我想从存储库返回一个项目列表 我怎么能在WebSocket会话中发送此列表 这是如何将项目列表发送到websocket的处理程序方法

  • 我正在使用reactive mongodb开发简单的spring webflux演示应用程序,我想按姓名读取员工的所有数据,但不包括姓名字段“joe”、“Sara”、“joe”、“Sara”,我有如下代码: //仓库接口 //服务类

  • 我有一个Restapi,它将从一个网站下载pdf文件,然后将pdf文件返回给调用者。 使用下面的代码,我可以得到