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&lt;MyPojo&gt; 类似

    public Mono<MyPojo> monoPojo(String parameter) 
        return WebClient.create("http://...").get().retrieve().bodyToMono(MyPojo.class)
                .map(oneMyPojo -> unregisterRepository.insert(oneMyPojo))
                ;
    

但我也遇到了返回响应实体的项目,即 MyPojo Mono&lt;ResponseEntity&lt;MyPojo&gt;&gt; 的响应实体 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 的使用。 请问这个Mono能给Mono带来什么样的好处?

谢谢

【问题讨论】:

ResponseEntity 允许您获取状态以及 ResponseEntity 为您提供的任何其他内容。实际上,您应该使用功能端点中的 ServerResponse,因为 ResponseEntity 来自 servlet mvc lib(如果我没记错的话)。 spring.getdocs.org/en-US/spring-framework-docs/docs/… 【参考方案1】:

让我们弄清楚一些事情

ResponseEntity&lt;T&gt; 来自 org.springframework.http 包,而 ServerResponse 来自 org.springframework.web.reactive.function.server 包。

这应该作为一个开始应该给你一个提示,什么时候使用什么,在哪里使用。

但简而言之,您可以通过 2 种方式使用 webflux,或者使用老式的 @RestController 注释,并为每个路径添加注释函数。这是常规 servlet spring web 和 webflux 异步事件驱动编程之间的一种“向后兼容模式”。

ResponseEntities 是从旧的 spring-web 返回的,而如果您选择使用 webflux 中存在的功能性端点,则需要返回 ServerResponses

如果您查看类的代码,您会发现它们的某些部分工作相同,但其他部分不同,尤其是它们如何存储主体和序列化主体。

Handler functionsFilter functions 在 webflux 中仅适用于 ServerResponses

现在回答您的问题,返回Mono&lt;ResponseEntity&lt;T&gt;Mono&lt;T&gt;

这一切都取决于你有多懒。

如果您返回Mono&lt;T&gt;,框架将尝试找出您在Mono 中的内容类型,然后相应地创建ResponseEntity。所以如果你把它序列化成json,它会为你设置content-type,并且通常设置状态为200 OK

如果您愿意,您可以构建您的 ResponseEntity 完全自定义,并返回任何状态代码、任何正文和任何标题等。

所以这一切都归结为你有多懒,你希望框架为你做多少,以及你想显式地做多少,并自己输入所有内容,或自定义。

我,我懒,我只是返回一些有用的东西。

【讨论】:

以上是关于Spring Webflux:控制器返回 Mono<ResponseEntity<MyPojo>> vs Mono<MyPojo>的主要内容,如果未能解决你的问题,请参考以下文章

Spring WebFlux,单元测试 Mono 和 Flux

Spring WebFlux:从控制器提供文件

如何在 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