Spring WebFlux + ReactiveMongoDB,无法保存实体。

问题描述 投票:1回答:1

我期望程序执行后,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> {
}
java spring mongodb spring-webflux reactivemongo
1个回答
1
投票

你的反应链没有设置正确。

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);
© www.soinside.com 2019 - 2024. All rights reserved.