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

uelo1irk  于 2023-04-04  发布在  Spring
关注(0)|答案(2)|浏览(181)

在Spring Webflux中,ResponseEntity与Mono作为rest控制器的返回类型有什么区别?
什么时候最适合做什么?
在这个问题上,假设我需要返回一个列表,或者说Foo的几个元素,有很多返回Flux的例子。返回ResponseEntity或Flux有意义吗?
当我在寻找这个问题时,我发现这里发布了同样的问题:https://github.com/spring-projects/spring-framework/issues/22614,但没有答案,我搜索了 Spring 文档,但没有找到信息。

r3i60tvu

r3i60tvu1#

https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-ann-responseentity
WebFlux支持使用单值React类型来异步生成ResponseEntity,和/或为主体使用单值和多值React类型。
因此,带注解的控制器上的返回类型实际上是一个响应式发布器,如Flux或Mono,它发出一个表示要返回的数据的对象。
示例

Flux<AccountDto>

或者还有:

Flux<ResponseEntity<AccountDto>>

我认为你甚至可以设置一个原始的DTO类型作为返回类型,Webflux会自动将它 Package 在一个发布者中。

有效返回类型

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

非阻塞React范式

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

内部

虽然SpringMVC和Spring Webflux annotated controllers看起来很相似,但它们在内部有很大的不同。例如,默认情况下,Webflux使用Jetty,而SpringMVC使用Tomcat。在内部,Webflux更像是一个非阻塞事件循环架构,而SpringMVC传统上利用线程池,每个请求1个线程阻塞I/O。
查看这篇文章,了解有关Spring WebFlux的更多详细信息

zi8p0yeb

zi8p0yeb2#

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

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

相关问题