关于我在 Spring Webflux 中看到的一些返回类型的小问题。
在许多示例中,如在线教程,Spring Webflux 项目的其余 Web Controller 将返回 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 Mono<ResponseEntity<MyPojo>>
: 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请问这个 Mono
谢谢
最佳答案
让我们澄清一些事情
一个 ResponseEntity<T>
来自 org.springframework.http
包同时一个 ServerResponse
来自 org.springframework.web.reactive.function.server
包裹。
这应该作为开始应该给您提示何时使用什么,以及在哪里。
但简而言之,您可以通过两种方式使用 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
完全自定义,并返回任何状态代码、任何正文和任何标题等。
所以归根结底是你有多懒,你想让框架为你做多少,你想要明确地做多少,然后自己输入所有内容,或自定义。
我,我很懒,我只是返回一些有用的东西。
关于java - Spring Webflux : Controller return Mono<ResponseEntity<MyPojo>> vs Mono<MyPojo>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69080915/