ResponseEntity<Mono> 和 Mono<ResponseEntity> 作为休息控制器的返回类型有什么区别

Cha*_*ang 13 mono spring response flux spring-webflux

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

什么时候最合适?

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

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

谢谢您的帮助。

Ros*_*hev 5

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

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


ana*_*ocs 0

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

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

因此,带注释的控制器上的返回类型实际上是像 Flux 或 Mono 这样的 Reactive Publisher,它发出一个表示要返回的数据的对象。

例子

Flux<AccountDto>
Run Code Online (Sandbox Code Playgroud)

或者也可以:

Flux<ResponseEntity<AccountDto>>
Run Code Online (Sandbox Code Playgroud)

我认为您甚至可以将原始 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的更多详细信息