spring boot webflux中如何根据条件进行两次删除操作?

Posted

技术标签:

【中文标题】spring boot webflux中如何根据条件进行两次删除操作?【英文标题】:How to do two delete operation based on condition in spring boot webflux? 【发布时间】:2021-08-18 12:13:17 【问题描述】:

我正在尝试根据以下条件使用 Webflux 进行删除操作(r2dbc),但 switchIf empty 没有按预期工作。 特定项目已成功删除始终打印,无论是否满足过滤条件。

Mono.just(cart).filter(cart1 -> CollectionUtils.isNotEmpty(cart1.getItems()))
    .flatMapMany(cartV->Flux.fromIterable(cartV.getCartItems())).flatMap(items -> deleteItemsByIdName(id, items))
    .then(Mono.just("Specific Items are deleted successfully")).log().switchIfEmpty(deleteAllItems(id).then(Mono.just("All Items are deleted successfully"))).log();

请告诉我,我在这里缺少什么。或者我需要完全改变逻辑?

【问题讨论】:

【参考方案1】:

实际上,switchIfEmpty 的工作方式与应有的完全一样。您遇到的问题是由.then(Mono.just("Specific Items are deleted successfully")) 引起的。 then 方法在收到来自上游发布者的完整信号后发送给定的Mono。换句话说,当您的条件不满足时,cart 项目不会转换为Flux 并且它们不会被删除,但无论如何都会记录该消息。看看doOnNext,看看这样的东西是否有效:

Mono.just(cart)
                .filter(cart1 -> CollectionUtils.isNotEmpty(cart1.getItems()))
                .flatMapMany(cartV -> Flux.fromIterable(cartV.getCartItems()))
                .flatMap(item -> deleteItemsByIdName(id, item)
                        .doOnNext(res -> log.info("Item " + item + " has been removed"))
                )
                .switchIfEmpty(deleteAllItems(id).doOnNext(res -> log.info("All items have been removed")));

【讨论】:

以上是关于spring boot webflux中如何根据条件进行两次删除操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring boot 2 + Webflux + Thymeleaf 中配置 i18n?

spring-boot-webflux 中未使用配置的 ObjectMapper

如何在 Spring Boot WebFlux 中使用 GET 请求注销

如何使用 Spring Boot Security 修复 Spring Boot Webflux 应用程序中的“名称为 requestMappingHandlerAdapter 的 bean 定义无效

如何在 Spring Boot 和 Spring WebFlux 中使用“功能 bean 定义 Kotlin DSL”?

如何使用 Spring Boot 对 WebFlux 进行异常处理?