Spring DTO 之间的 webFlux 差异

Spring webFlux difference between DTOs

我使用 Spring 启动响应式 Web 流量作为我的休息端点。

有什么区别:

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

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

我不明白我的控制器方法的输入参数有何不同。我知道一个是 pojo,另一个是单声道,但从反应的角度来看,这意味着什么?

首先,一些背景。您正在使用 1.4. Annotated Controllers classes for WebFlux. These implementations are based on the 1.5. Functional Endpoints 类。我建议直接使用功能端点。

从反应性 POV 中,您必须了解您需要创建反应性流程。在 Mono 方法中已经为您创建了它,在 SomeDTO 方法中您可能应该使用 Mono.just(someDTO) 来创建它。

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

因此,考虑两个单声道创建语句。

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会保存在repo中,然后mono返回给客户端,订阅时什么都不做。错误的!在第二种情况下,mono 将返回给客户端,线程释放回 webflux 框架以用于另一个请求,当客户端订阅返回的 mono 时,someDto 将被保存。你在追求什么。

通过

正确处理第一个案例
return Mono.just(someDto).map(repo::save);

这是 Mono.just(someDto) 你自己做的,而在你的第二种情况下,webflux 框架正在为你做。

选哪个?如果您只是打算将 someDto 包装在一个单声道中并使用它,那么不妨让框架为您完成或使用功能端点。如果您出于其他原因要创建一个单声道,然后在映射过程中使用 someDto,请使用您的第一个案例。第二个原因是,恕我直言,这是一个罕见的用例。

通常在使用功能端点时,您最终会做 request.bodyToMono(SomeDto.class),这相当于您的第二种情况以及框架在第二种情况下为您完成的工作。