在Spring Webflux中,ResponseEntity与Mono作为rest控制器的返回类型有什么区别?
什么时候最适合做什么?
在这个问题上,假设我需要返回一个列表,或者说Foo的几个元素,有很多返回Flux的例子。返回ResponseEntity或Flux有意义吗?
当我在寻找这个问题时,我发现这里发布了同样的问题:https://github.com/spring-projects/spring-framework/issues/22614,但没有答案,我搜索了 Spring 文档,但没有找到信息。
2条答案
按热度按时间r3i60tvu1#
https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-ann-responseentity
WebFlux支持使用单值React类型来异步生成ResponseEntity,和/或为主体使用单值和多值React类型。
因此,带注解的控制器上的返回类型实际上是一个响应式发布器,如Flux或Mono,它发出一个表示要返回的数据的对象。
示例
或者还有:
我认为你甚至可以设置一个原始的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的更多详细信息
zi8p0yeb2#
以下是可以使用
ResponseEntity
返回值的各种选项:ResponseEntity<Mono<T>>
或ResponseEntity<Flux<T>>
--这使得响应状态和头部立即被知道,而主体在稍后异步提供。主体是Mono
还是Flux
取决于响应有多少个值。Mono<ResponseEntity<T>>
--这提供了所有三个--响应状态、头和主体,稍后异步提供。IT允许响应状态和头根据异步请求处理的结果而变化。Mono<ResponseEntity<Mono<T>>>
或Mono<ResponseEntity<Flux<T>>>
也是可能的,但不太常见。它们首先异步地提供响应状态和头部,然后异步地提供响应主体,在第二点也是异步的。