【问题标题】:Spring WebFlux + ReactiveMongoDB, Can't save entitySpring WebFlux + ReactiveMongoDB,无法保存实体
【发布时间】:2020-06-09 17:45:03
【问题描述】:

我希望程序执行后,Rubber 会保存在 mongo 中。结果是 200 OK,但没有保存到数据库中,我怀疑问题出在 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


    【解决方案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);
    

    【讨论】:

    • @ocathern 除非它以某种方式阻塞(几乎可以肯定不是),否则您的转换器响应式是没有意义的。所以这很好。
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2018-01-13
    • 2018-05-22
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多