Spring Webflux:控制器返回 Mono<ResponseEntity<MyPojo>> vs Mono<MyPojo>
Posted
技术标签:
【中文标题】Spring Webflux:控制器返回 Mono<ResponseEntity<MyPojo>> vs Mono<MyPojo>【英文标题】:Spring Webflux: Controller return Mono<ResponseEntity<MyPojo>> vs Mono<MyPojo> 【发布时间】:2021-11-03 22:04:34 【问题描述】:请关于我在 Spring Webflux 中看到的一些返回类型的小问题。
在许多示例中,例如在线教程,Spring Webflux 项目的其余 Web 控制器将返回 MyPojo 的 Mono Mono<MyPojo>
类似
public Mono<MyPojo> monoPojo(String parameter)
return WebClient.create("http://...").get().retrieve().bodyToMono(MyPojo.class)
.map(oneMyPojo -> unregisterRepository.insert(oneMyPojo))
;
但我也遇到了返回响应实体的项目,即 MyPojo Mono<ResponseEntity<MyPojo>>
的响应实体 Mono :
public Mono<ResponseEntity<MyPojo>> monoResponseEntityPojo(String parameter)
return WebClient.create("http://...").get().retrieve().bodyToMono(MyPojo.class)
.map(oneMyPojo -> unregisterRepository.insert(oneMyPojo))
.map(ResponseEntity::ok)
;
我很难理解 Mono
谢谢
【问题讨论】:
ResponseEntity 允许您获取状态以及 ResponseEntity 为您提供的任何其他内容。实际上,您应该使用功能端点中的 ServerResponse,因为 ResponseEntity 来自 servlet mvc lib(如果我没记错的话)。 spring.getdocs.org/en-US/spring-framework-docs/docs/… 【参考方案1】:让我们弄清楚一些事情
ResponseEntity<T>
来自 org.springframework.http
包,而 ServerResponse
来自 org.springframework.web.reactive.function.server
包。
这应该作为一个开始应该给你一个提示,什么时候使用什么,在哪里使用。
但简而言之,您可以通过 2 种方式使用 webflux,或者使用老式的 @RestController
注释,并为每个路径添加注释函数。这是常规 servlet spring web 和 webflux 异步事件驱动编程之间的一种“向后兼容模式”。
ResponseEntities
是从旧的 spring-web
返回的,而如果您选择使用 webflux 中存在的功能性端点,则需要返回 ServerResponses
。
如果您查看类的代码,您会发现它们的某些部分工作相同,但其他部分不同,尤其是它们如何存储主体和序列化主体。
Handler functions
和 Filter functions
在 webflux 中仅适用于 ServerResponses
。
现在回答您的问题,返回Mono<ResponseEntity<T>
或Mono<T>
。
这一切都取决于你有多懒。
如果您返回Mono<T>
,框架将尝试找出您在Mono
中的内容类型,然后相应地创建ResponseEntity
。所以如果你把它序列化成json,它会为你设置content-type
,并且通常设置状态为200 OK
如果您愿意,您可以构建您的 ResponseEntity
完全自定义,并返回任何状态代码、任何正文和任何标题等。
所以这一切都归结为你有多懒,你希望框架为你做多少,以及你想显式地做多少,并自己输入所有内容,或自定义。
我,我懒,我只是返回一些有用的东西。
【讨论】:
以上是关于Spring Webflux:控制器返回 Mono<ResponseEntity<MyPojo>> vs Mono<MyPojo>的主要内容,如果未能解决你的问题,请参考以下文章
Spring WebFlux,单元测试 Mono 和 Flux
如何在 Spring Webflux 中返回 Mono<Map<String, Flux<Integer>>> 响应?
Spring Webflux(Mono/Flux) 与 AOP 在拦截时触发 REST 调用并使用 Mono/Flux
spring-boot-webflux 中未使用配置的 ObjectMapper
Mono<ServerResponse> 与 Mono<ResponseEntity<MyPojo>> 作为 Java Spring Webflux @Reques