SpringWebFlux:如何比较两个单声道流的结果并基于过滤器保存

z31licg0  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(271)

情况如下:我有两个mongodb文档:用户和复制。
在检查用户是否有复制条目(文档)的基础上,我想在mongodb中添加另一个实体。
目前我正在使用SpringWebFlux和SpringMongo。请参阅下面的代码。

@Autowired
    ParserRepository parserRepository;

    @Autowired
    ReproductionRepository reproductionRepository;

    @Autowired
    UserRepository userRepository;

    public void addParser(Parser parser, String keycloakUserId) {

        Mono<User> userMono = userRepository.findByKeycloakUserId(keycloakUserId);
        Mono<Reproduction> reproductionMono = reproductionRepository.findById(parser.getReproductionId());

        userMono.zipWith(reproductionMono)
                .filter(objects -> objects.getT2().getUserId().equals(objects.getT1().get_id()))
                .then(parserRepository.save(parser))
                .switchIfEmpty(Mono.error(new ParserDoesNotBelongToUserException("Unable to add, since this parser does not belong to you")));

    }

我的问题如下:如何使用mono的结果来验证是否存在正确的mono,并基于save解析器文档。基本上结合两个mono流的结果来执行另一个文档的保存,并以非阻塞的方式执行。
上述方法显然不起作用。在这种情况下,用两个单独的单声道来做这个场景的最佳方法是什么?欢迎提供任何最佳实践提示。

5ktev3wc

5ktev3wc1#

取自 Mono#filter 文件:
筛选器( predicate <?super t>tester)如果这个mono有值,测试结果并在 predicate 返回true时重放它。
因此,如果筛选器的计算结果为true,它将通过该值,如果为false,则不会。
问题是你在打电话 then 之后。文档 Mono#then 然后(单声道其他)让这个单声道完成,然后播放另一个单声道。
这里的关键词是 complete 这基本上意味着,不管前一行用什么结束,它都被忽略,只要它结束。因此,无论它在前一行中用(false/true)完成了什么,我们运行它都无关紧要 then 不管怎样。
我猜你想要的是:

userMono.zipWith(reproductionMono).flatMap(objects -> {
    if(objects.getT2().getUserId().equals(objects.getT1().get_id()))) {
        return parserRepository.save(parser)
    } else {
        return Mono.error(new ParserDoesNotBelongToUserException("Unable to add, since this parser does not belong to you"));
    }
}

相关问题