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
相关产品推荐
相关产品推荐

