当前位置: 首页 > 知识库问答 >
问题:

Spring webFlux DTO之间的差异

巫晋鹏
2023-03-14

我使用Spring boot反应式web流量作为restendpoint。

以下两者之间的区别是什么:

@PostMapping
public Mono someMethod(@RequestBody SomeDTO someDto){
.....

@PostMapping
public Mono someMethod(@RequestBody Mono<SomeDTO> someDTO) {
....

我不理解我的控制器方法在输入参数上的差异。我知道一个是pojo,另一个是mono,但从反应的角度来看,这意味着什么?

共有1个答案

宣望
2023-03-14

首先,一些背景。您正在使用1.4。WebFlux的注释控制器类。这些实现基于1.5。功能endpoint类。我建议直接使用功能endpoint。

从反应式POV中,您必须了解您需要创建反应式流。在Mono方法中,这是为您创建的,在某个DTO方法中,您可能应该使用Mono.just(某个DTO)来创建它。

在该语句中需要了解的是,创建语句将在构建阶段而不是反应语句的执行阶段执行。构建阶段不是异步执行的。

因此,考虑两个mono创建语句。

return Mono.just(Thread.sleep(1000));

return Mono.just(1000).map(Thread::sleep);

是的,我知道它不会因为中断的异常而编译,但是在第一种情况下,Mono直到1秒才会返回给客户端,然后在订阅时它什么也不会做。在第二种情况下,mono将立即返回给客户端,并在订阅后等待一秒钟。第二个是你正在努力争取的。

这对你意味着什么?考虑

return Mono.just(repo.save(someDto));

return someDto.map(repo::save);

在第一种情况下,如上所述,someDto将保存在回购中,然后mono将返回给客户,并且在订阅时不会执行任何操作。错误的在第二种情况下,mono将返回给客户端,线程释放回webflux框架以用于另一个请求,并且当客户端订阅返回的mono时,将保存someDto。你在努力什么。

通过以下方法正确处理第一个案例:

return Mono.just(someDto).map(repo::save);

这就是单声道。只需要(someDto)你自己,而在第二种情况下,webflux框架正在为你做这件事。

选择哪一个?如果你只是想在mono中封装一些数据并使用它,那么最好让框架为你做,或者使用功能endpoint。如果您打算出于其他原因创建单声道,然后在映射过程中使用someDto,请使用第一种情况。第二个原因是,IMHO是一个罕见的用例。

通常,在使用功能endpoint时,您最终会执行请求。bodyToMono(SomeDto.class)这相当于您的第二个案例,以及框架在第二个案例中为您做了什么。

 类似资料:
  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 在swift中似乎有两个相等运算符:双相等()和三相等(),这两者有什么区别?

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?

  • 本文向大家介绍成本差异和进度差异之间的差异,包括了成本差异和进度差异之间的差异的使用技巧和注意事项,需要的朋友参考一下 对于任何应用程序或专门用于任何项目,最关注的因素之一是在开发前和开发后阶段的预算管理和时间管理。因此,要评估任何项目的这两个主要因素,有很多方法,其中成本差异和进度差异是两个重要且主要的方法。 顾名思义,“成本差异”基于项目开发中花费的成本,而“进度差异”则基于相同开发中花费的时

  • 问题内容: package main 该代码可以很好地工作。但是,如果按如下所示更改方法,则会导致死循环。区别在于将替换为。为什么? 问题答案: 因为程序包检查要打印的值是否具有方法(或换句话说:是否实现接口),如果是,则将调用它以获取值的表示形式。 软件包doc中对此进行了说明: […]如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(

  • 我正在通过做微控制器项目来自学C++。我当前的项目是使用一对或Adafruit羽毛分组无线电。无线电数据包的库函数需要一个C样式的字符串(我相信),我理解它是一个char的数组。 我已经设置了一个枚举来反映接收方的各种操作,并希望将该状态发送回发送方。所以我想把枚举变成char的数组。 在搜索将枚举转换为char数组的方法时,最简单的方法(对我来说)是将枚举变量传递给带有switch语句的函数,该

  • 问题内容: 时间1:17:05时间2:17:08 我想在几秒钟内得到差异。 问题答案: long diffInMillis = newerDate.getTime() - olderDate.getTime() 必看 API文件

  • 我是Hadoop的新手。我正在浏览专业Hadoop解决方案的书,以获得一些关于Hadoop和生态系统的知识。我想澄清HDFS和HBase之间的主要区别是什么。我理解的方式就像两者都是存储系统。它们的区别只是在访问数据方面。HBase通过非关系型数据库访问数据,HDFS使用计算框架(MapReduce)处理数据。如果是这种情况,为什么我们不能只有一个存储HDFS或HBase。根据需求,他们将插入和插