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”?