You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebFlux执行保存后加审计且不丢失初始Mono对象的实现问题

解决Reactor中添加审计后类型错误的问题

问题根源

你之前的错误是因为在save()后的map操作中返回了Auditoria对象,导致整个流的类型从Mono<QdCFEntity>变成了Mono<Auditoria>,后续调用toPresenter时自然会因为参数类型不匹配报错。核心需求是执行审计操作的同时,保持流中传递的是保存后的QdCFEntity对象。

解决方案

根据审计操作是同步还是异步,有两种实现方式:

1. 同步审计操作(无返回值或返回同步结果)

使用doOnSuccess操作符执行审计——这是Reactor中处理副作用操作的标准方式,它不会改变流中的元素类型,仅在流成功完成时执行逻辑:

public Mono<QdCFPresenter> store(QdCFPresenter presenter) {
    QdCFEntity entity = qdCFPresenterMapper.toEntity(presenter);
    return qdcfRepository.save(entity)
            // 执行审计,不改变流的元素
            .doOnSuccess(savedEntity -> auditoriaService.log(savedEntity))
            // 继续用保存后的实体映射回Presenter
            .map(savedEntity -> qdCFPresenterMapper.toPresenter(savedEntity));
}

2. 异步审计操作(返回Mono)

如果审计方法是异步的(返回Mono),则使用flatMap,在完成审计后通过thenReturn将原始实体传回流中,确保后续操作拿到的仍是QdCFEntity:

public Mono<QdCFPresenter> store(QdCFPresenter presenter) {
    QdCFEntity entity = qdCFPresenterMapper.toEntity(presenter);
    return qdcfRepository.save(entity)
            .flatMap(savedEntity -> 
                // 先执行异步审计,再返回原始实体
                auditoriaService.logAsync(savedEntity)
                        .thenReturn(savedEntity)
            )
            .map(savedEntity -> qdCFPresenterMapper.toPresenter(savedEntity));
}

关键说明

  • doOnSuccess:适用于不需要等待结果的副作用操作,日志、审计这类场景非常契合,性能开销小。
  • flatMap + thenReturn:当审计操作是异步时,确保流的顺序执行,同时保留原始数据,不会改变流的类型。

这样修改后,既完成了审计需求,又能正确将保存后的实体映射回QdCFPresenter,不会再出现类型错误。

内容的提问来源于stack exchange,提问作者Jordi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:30:50