我期望程序执行后,Rubber会被保存在mongo中。结果是200 O.K,但没有任何东西保存到数据库中,我怀疑问题出在doOnSuccess方法上。如何使用它?或者还有什么问题?
@PostMapping
public Mono<Rubber> create(@RequestBody Rubber rubber) {
return rubberService.create(rubber);
}
@Override
public Mono<Rubber> create(Rubber rubber) {
return Mono.just(rubber)
.map(rubberToRubberEntityConverter::convert)
.doOnSuccess(rubberRepository::save)
.doOnError((throwable) -> Mono.error(new ApplicationException("Can't create ruber :( ", throwable)))
.map(rubberEntityToRubberConverter::convert);
}
@Repository
public interface RubberRepository extends ReactiveMongoRepository<RubberEntity, String> {
}
你的反应链没有设置正确。
return Mono.just(rubber)
.map(rubberToRubberEntityConverter::convert)
.doOnSuccess(rubberRepository::save)
你实际上并没有做任何反应性的事情 -- 你只是取了一个值,然后把它封装在一个... Mono
在这种情况下,你的侧效果只是简单地设置反应链以保存到存储库(将返回一个 Mono
),但 自此 Mono
从未订阅,保存从未实际发生。
您的 doOnError()
调用也有类似的问题--你又返回了一个 Mono
而不是执行副作用。相反,您几乎肯定要使用 onErrorMap()
以在一种错误和另一种错误之间进行转换。
简而言之,任何时候你使用 doOnSuccess()
, doOnError()
等,并使用一个返回某种描述的发布者的方法,这几乎总是要做错事。使用 Mono.just()
也是一种暗示,你不是从反应链开始的--不一定是......。错的 本身,但它可能是一个警告信号,表明你实际上没有创建一个 "真正的 "反应链。
相反,你可能想要这样的东西。
return rubberRepository.save(rubberToRubberEntityConverter.convert(rubber))
.onErrorMap((throwable) -> new ApplicationException("Can't create rubber :( ", throwable))
.map(rubberEntityToRubberConverter::convert);