【问题标题】:what is the difference between ResponseEntity<Mono> and Mono<ResponseEntity> as a return type of a rest controllerResponseEntity<Mono> 和 Mono<ResponseEntity> 作为休息控制器的返回类型有什么区别
【发布时间】:2020-01-06 05:07:57
【问题描述】:

在 Spring Webflux 中,ResponseEntity 与 Mono 作为休息控制器的返回类型有什么区别?

什么时候最适合什么?

跟进这个问题,假设我需要返回一个列表,或者说Foo的几个元素,有很多返回Flux的例子。 返回 ResponseEntity 或 Flux 有意义吗?

当我在寻找这个问题时,我在这里发现了同样的问题:https://github.com/spring-projects/spring-framework/issues/22614,但没有答案,我搜索了 spring 文档,但没有找到任何信息。

感谢您的帮助。

【问题讨论】:

  • 第一个返回一个自身包含 Mono 的 ResponseEntity。另一种是返回ResponseEntity 的反应方式。通量样本返回一个写入FluxResponseEntity,另一个返回一个FluxResponseEntity 实例。

标签: spring mono response spring-webflux flux


【解决方案1】:

以下是您可以使用 ResponseEntity 返回值进行的各种选项:

  • ResponseEntity&lt;Mono&lt;T&gt;&gt;ResponseEntity&lt;Flux&lt;T&gt;&gt; - 这使得响应状态和标头立即知道,而主体在稍后异步提供。正文是 Mono 还是 Flux 取决于响应有多少值。
  • Mono&lt;ResponseEntity&lt;T&gt;&gt; -- 这提供了所有三个 -- 响应状态、标题和正文,稍后异步。 IT 允许响应状态和标头根据异步请求处理的结果而变化。
  • Mono&lt;ResponseEntity&lt;Mono&lt;T&gt;&gt;&gt;Mono&lt;ResponseEntity&lt;Flux&lt;T&gt;&gt;&gt; 也是可能的,但不太常见。它们首先异步提供响应状态和标头,然后是响应正文,稍后也会异步提供。

【讨论】:

  • 这是有见地的,很棒的答案!然而,在实践中它是相当混乱的。您是否知道任何示例可以证明您在现实世界项目中的理解。我正在尝试使用响应式选项为 Spring Boot 开放 api 生成器来创建要实现的接口存根。返回签名是:Mono&lt;ResponseEntity&lt;Game&gt;&gt;Mono&lt;ResponseEntity&lt;Void&gt;&gt;Mono&lt;ResponseEntity&lt;Flux&lt;ContactDTO&gt;&gt;&gt;最令人困惑的是,这在您的意见/经验中是否准确?)。非常感谢!
【解决方案2】:

https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-ann-responseentity

WebFlux 支持使用单值反应类型来生成 ResponseEntity 异步,和/或单值和多值反应式 身体的类型。

因此,带注释的控制器上的返回类型实际上是响应式发布器,例如 Flux 或 Mono,它发出一个表示要返回的数据的对象。

例子

Flux<AccountDto>

也可以:

Flux<ResponseEntity<AccountDto>>

我认为您甚至可以将原始 DTO 类型设置为返回类型,Webflux 会自动为您将其包装在发布者中。

有效的返回类型

https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-ann-return-types

例如:https://github.com/oktadeveloper/okta-spring-webflux-react-example/blob/react-app/reactive-web/src/main/java/com/example/demo/ProfileRestController.java

非阻塞响应式范式

在进行响应式编程时,您希望每一层都通过 Flux/Mono 进行通信。所以你会从你的 ReactiveRepository 中取回一个 Flux 并且服务层也会返回一个 Flux 给 Controller。基本上,在响应式编程中,一切都是 Flux/Mono。

内部

虽然 SpringMVC 和 Spring Webflux 带注释的控制器看起来很相似,但它们在内部却大不相同。例如,Webflux 默认使用 Jetty,而 SpringMVC 默认使用 Tomcat。在内部,Webflux 更像是一个非阻塞事件循环架构,而 SpringMVC 传统上利用线程池,每个请求阻塞 1 个线程用于 I/O。

查看这篇文章了解更多关于Spring WebFlux的详细信息

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 2021-03-25
    • 1970-01-01
    • 2022-12-23
    • 2018-12-07
    • 2023-03-14
    • 1970-01-01
    • 2018-12-04
    • 2014-05-08
    相关资源
    最近更新 更多